local-cli-agent 5.0.4

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 (776) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +306 -0
  3. package/dist/agents/base/base-agent.d.ts +38 -0
  4. package/dist/agents/base/base-agent.d.ts.map +1 -0
  5. package/dist/agents/base/base-agent.js +69 -0
  6. package/dist/agents/base/base-agent.js.map +1 -0
  7. package/dist/agents/browser/browser-profile-manager.d.ts +16 -0
  8. package/dist/agents/browser/browser-profile-manager.d.ts.map +1 -0
  9. package/dist/agents/browser/browser-profile-manager.js +149 -0
  10. package/dist/agents/browser/browser-profile-manager.js.map +1 -0
  11. package/dist/agents/browser/browser-sub-agent.d.ts +22 -0
  12. package/dist/agents/browser/browser-sub-agent.d.ts.map +1 -0
  13. package/dist/agents/browser/browser-sub-agent.js +162 -0
  14. package/dist/agents/browser/browser-sub-agent.js.map +1 -0
  15. package/dist/agents/browser/confluence-agent.d.ts +3 -0
  16. package/dist/agents/browser/confluence-agent.d.ts.map +1 -0
  17. package/dist/agents/browser/confluence-agent.js +35 -0
  18. package/dist/agents/browser/confluence-agent.js.map +1 -0
  19. package/dist/agents/browser/index.d.ts +4 -0
  20. package/dist/agents/browser/index.d.ts.map +1 -0
  21. package/dist/agents/browser/index.js +4 -0
  22. package/dist/agents/browser/index.js.map +1 -0
  23. package/dist/agents/browser/jira-agent.d.ts +3 -0
  24. package/dist/agents/browser/jira-agent.d.ts.map +1 -0
  25. package/dist/agents/browser/jira-agent.js +35 -0
  26. package/dist/agents/browser/jira-agent.js.map +1 -0
  27. package/dist/agents/browser/prompts.d.ts +4 -0
  28. package/dist/agents/browser/prompts.d.ts.map +1 -0
  29. package/dist/agents/browser/prompts.js +241 -0
  30. package/dist/agents/browser/prompts.js.map +1 -0
  31. package/dist/agents/browser/search-agent.d.ts +3 -0
  32. package/dist/agents/browser/search-agent.d.ts.map +1 -0
  33. package/dist/agents/browser/search-agent.js +31 -0
  34. package/dist/agents/browser/search-agent.js.map +1 -0
  35. package/dist/agents/common/complete-tool.d.ts +3 -0
  36. package/dist/agents/common/complete-tool.d.ts.map +1 -0
  37. package/dist/agents/common/complete-tool.js +18 -0
  38. package/dist/agents/common/complete-tool.js.map +1 -0
  39. package/dist/agents/common/index.d.ts +3 -0
  40. package/dist/agents/common/index.d.ts.map +1 -0
  41. package/dist/agents/common/index.js +3 -0
  42. package/dist/agents/common/index.js.map +1 -0
  43. package/dist/agents/common/sub-agent.d.ts +40 -0
  44. package/dist/agents/common/sub-agent.d.ts.map +1 -0
  45. package/dist/agents/common/sub-agent.js +313 -0
  46. package/dist/agents/common/sub-agent.js.map +1 -0
  47. package/dist/agents/index.d.ts +5 -0
  48. package/dist/agents/index.d.ts.map +1 -0
  49. package/dist/agents/index.js +5 -0
  50. package/dist/agents/index.js.map +1 -0
  51. package/dist/agents/office/complete-tool.d.ts +3 -0
  52. package/dist/agents/office/complete-tool.d.ts.map +1 -0
  53. package/dist/agents/office/complete-tool.js +18 -0
  54. package/dist/agents/office/complete-tool.js.map +1 -0
  55. package/dist/agents/office/excel-agent.d.ts +3 -0
  56. package/dist/agents/office/excel-agent.d.ts.map +1 -0
  57. package/dist/agents/office/excel-agent.js +31 -0
  58. package/dist/agents/office/excel-agent.js.map +1 -0
  59. package/dist/agents/office/excel-create-agent.d.ts +3 -0
  60. package/dist/agents/office/excel-create-agent.d.ts.map +1 -0
  61. package/dist/agents/office/excel-create-agent.js +58 -0
  62. package/dist/agents/office/excel-create-agent.js.map +1 -0
  63. package/dist/agents/office/excel-create-prompts.d.ts +4 -0
  64. package/dist/agents/office/excel-create-prompts.d.ts.map +1 -0
  65. package/dist/agents/office/excel-create-prompts.js +217 -0
  66. package/dist/agents/office/excel-create-prompts.js.map +1 -0
  67. package/dist/agents/office/index.d.ts +10 -0
  68. package/dist/agents/office/index.d.ts.map +1 -0
  69. package/dist/agents/office/index.js +10 -0
  70. package/dist/agents/office/index.js.map +1 -0
  71. package/dist/agents/office/office-sub-agent.d.ts +21 -0
  72. package/dist/agents/office/office-sub-agent.d.ts.map +1 -0
  73. package/dist/agents/office/office-sub-agent.js +127 -0
  74. package/dist/agents/office/office-sub-agent.js.map +1 -0
  75. package/dist/agents/office/powerpoint-agent.d.ts +3 -0
  76. package/dist/agents/office/powerpoint-agent.d.ts.map +1 -0
  77. package/dist/agents/office/powerpoint-agent.js +37 -0
  78. package/dist/agents/office/powerpoint-agent.js.map +1 -0
  79. package/dist/agents/office/powerpoint-create-agent.d.ts +3 -0
  80. package/dist/agents/office/powerpoint-create-agent.d.ts.map +1 -0
  81. package/dist/agents/office/powerpoint-create-agent.js +1124 -0
  82. package/dist/agents/office/powerpoint-create-agent.js.map +1 -0
  83. package/dist/agents/office/powerpoint-create-prompts.d.ts +116 -0
  84. package/dist/agents/office/powerpoint-create-prompts.d.ts.map +1 -0
  85. package/dist/agents/office/powerpoint-create-prompts.js +1354 -0
  86. package/dist/agents/office/powerpoint-create-prompts.js.map +1 -0
  87. package/dist/agents/office/prompts.d.ts +11 -0
  88. package/dist/agents/office/prompts.d.ts.map +1 -0
  89. package/dist/agents/office/prompts.js +852 -0
  90. package/dist/agents/office/prompts.js.map +1 -0
  91. package/dist/agents/office/word-agent.d.ts +3 -0
  92. package/dist/agents/office/word-agent.d.ts.map +1 -0
  93. package/dist/agents/office/word-agent.js +31 -0
  94. package/dist/agents/office/word-agent.js.map +1 -0
  95. package/dist/agents/office/word-create-agent.d.ts +3 -0
  96. package/dist/agents/office/word-create-agent.d.ts.map +1 -0
  97. package/dist/agents/office/word-create-agent.js +36 -0
  98. package/dist/agents/office/word-create-agent.js.map +1 -0
  99. package/dist/agents/office/word-create-prompts.d.ts +4 -0
  100. package/dist/agents/office/word-create-prompts.d.ts.map +1 -0
  101. package/dist/agents/office/word-create-prompts.js +288 -0
  102. package/dist/agents/office/word-create-prompts.js.map +1 -0
  103. package/dist/agents/planner/index.d.ts +14 -0
  104. package/dist/agents/planner/index.d.ts.map +1 -0
  105. package/dist/agents/planner/index.js +334 -0
  106. package/dist/agents/planner/index.js.map +1 -0
  107. package/dist/cli.d.ts +3 -0
  108. package/dist/cli.d.ts.map +1 -0
  109. package/dist/cli.js +166 -0
  110. package/dist/cli.js.map +1 -0
  111. package/dist/commands/chat-command.d.ts +2 -0
  112. package/dist/commands/chat-command.d.ts.map +1 -0
  113. package/dist/commands/chat-command.js +90 -0
  114. package/dist/commands/chat-command.js.map +1 -0
  115. package/dist/commands/electron-client.d.ts +17 -0
  116. package/dist/commands/electron-client.d.ts.map +1 -0
  117. package/dist/commands/electron-client.js +180 -0
  118. package/dist/commands/electron-client.js.map +1 -0
  119. package/dist/commands/jarvis-command.d.ts +2 -0
  120. package/dist/commands/jarvis-command.d.ts.map +1 -0
  121. package/dist/commands/jarvis-command.js +66 -0
  122. package/dist/commands/jarvis-command.js.map +1 -0
  123. package/dist/constants.d.ts +11 -0
  124. package/dist/constants.d.ts.map +1 -0
  125. package/dist/constants.js +13 -0
  126. package/dist/constants.js.map +1 -0
  127. package/dist/core/compact/compact-manager.d.ts +22 -0
  128. package/dist/core/compact/compact-manager.d.ts.map +1 -0
  129. package/dist/core/compact/compact-manager.js +77 -0
  130. package/dist/core/compact/compact-manager.js.map +1 -0
  131. package/dist/core/compact/compact-prompts.d.ts +11 -0
  132. package/dist/core/compact/compact-prompts.d.ts.map +1 -0
  133. package/dist/core/compact/compact-prompts.js +90 -0
  134. package/dist/core/compact/compact-prompts.js.map +1 -0
  135. package/dist/core/compact/context-tracker.d.ts +28 -0
  136. package/dist/core/compact/context-tracker.d.ts.map +1 -0
  137. package/dist/core/compact/context-tracker.js +71 -0
  138. package/dist/core/compact/context-tracker.js.map +1 -0
  139. package/dist/core/compact/index.d.ts +4 -0
  140. package/dist/core/compact/index.d.ts.map +1 -0
  141. package/dist/core/compact/index.js +4 -0
  142. package/dist/core/compact/index.js.map +1 -0
  143. package/dist/core/config/config-manager.d.ts +43 -0
  144. package/dist/core/config/config-manager.d.ts.map +1 -0
  145. package/dist/core/config/config-manager.js +254 -0
  146. package/dist/core/config/config-manager.js.map +1 -0
  147. package/dist/core/config/index.d.ts +2 -0
  148. package/dist/core/config/index.d.ts.map +1 -0
  149. package/dist/core/config/index.js +2 -0
  150. package/dist/core/config/index.js.map +1 -0
  151. package/dist/core/docs-manager.d.ts +46 -0
  152. package/dist/core/docs-manager.d.ts.map +1 -0
  153. package/dist/core/docs-manager.js +475 -0
  154. package/dist/core/docs-manager.js.map +1 -0
  155. package/dist/core/git-auto-updater.d.ts +58 -0
  156. package/dist/core/git-auto-updater.d.ts.map +1 -0
  157. package/dist/core/git-auto-updater.js +374 -0
  158. package/dist/core/git-auto-updater.js.map +1 -0
  159. package/dist/core/llm/index.d.ts +2 -0
  160. package/dist/core/llm/index.d.ts.map +1 -0
  161. package/dist/core/llm/index.js +2 -0
  162. package/dist/core/llm/index.js.map +1 -0
  163. package/dist/core/llm/llm-client.d.ts +110 -0
  164. package/dist/core/llm/llm-client.d.ts.map +1 -0
  165. package/dist/core/llm/llm-client.js +1272 -0
  166. package/dist/core/llm/llm-client.js.map +1 -0
  167. package/dist/core/session/index.d.ts +2 -0
  168. package/dist/core/session/index.d.ts.map +1 -0
  169. package/dist/core/session/index.js +2 -0
  170. package/dist/core/session/index.js.map +1 -0
  171. package/dist/core/session/session-manager.d.ts +73 -0
  172. package/dist/core/session/session-manager.d.ts.map +1 -0
  173. package/dist/core/session/session-manager.js +260 -0
  174. package/dist/core/session/session-manager.js.map +1 -0
  175. package/dist/core/slash-command-handler.d.ts +31 -0
  176. package/dist/core/slash-command-handler.d.ts.map +1 -0
  177. package/dist/core/slash-command-handler.js +304 -0
  178. package/dist/core/slash-command-handler.js.map +1 -0
  179. package/dist/core/telemetry/error-reporter.d.ts +2 -0
  180. package/dist/core/telemetry/error-reporter.d.ts.map +1 -0
  181. package/dist/core/telemetry/error-reporter.js +3 -0
  182. package/dist/core/telemetry/error-reporter.js.map +1 -0
  183. package/dist/core/usage-tracker.d.ts +70 -0
  184. package/dist/core/usage-tracker.d.ts.map +1 -0
  185. package/dist/core/usage-tracker.js +251 -0
  186. package/dist/core/usage-tracker.js.map +1 -0
  187. package/dist/errors/base.d.ts +22 -0
  188. package/dist/errors/base.d.ts.map +1 -0
  189. package/dist/errors/base.js +43 -0
  190. package/dist/errors/base.js.map +1 -0
  191. package/dist/errors/file.d.ts +31 -0
  192. package/dist/errors/file.d.ts.map +1 -0
  193. package/dist/errors/file.js +110 -0
  194. package/dist/errors/file.js.map +1 -0
  195. package/dist/errors/index.d.ts +10 -0
  196. package/dist/errors/index.d.ts.map +1 -0
  197. package/dist/errors/index.js +41 -0
  198. package/dist/errors/index.js.map +1 -0
  199. package/dist/errors/llm.d.ts +30 -0
  200. package/dist/errors/llm.d.ts.map +1 -0
  201. package/dist/errors/llm.js +97 -0
  202. package/dist/errors/llm.js.map +1 -0
  203. package/dist/errors/network.d.ts +19 -0
  204. package/dist/errors/network.d.ts.map +1 -0
  205. package/dist/errors/network.js +82 -0
  206. package/dist/errors/network.js.map +1 -0
  207. package/dist/errors/validation.d.ts +19 -0
  208. package/dist/errors/validation.d.ts.map +1 -0
  209. package/dist/errors/validation.js +62 -0
  210. package/dist/errors/validation.js.map +1 -0
  211. package/dist/eval/eval-runner.d.ts +24 -0
  212. package/dist/eval/eval-runner.d.ts.map +1 -0
  213. package/dist/eval/eval-runner.js +291 -0
  214. package/dist/eval/eval-runner.js.map +1 -0
  215. package/dist/eval/index.d.ts +3 -0
  216. package/dist/eval/index.d.ts.map +1 -0
  217. package/dist/eval/index.js +3 -0
  218. package/dist/eval/index.js.map +1 -0
  219. package/dist/eval/types.d.ts +77 -0
  220. package/dist/eval/types.d.ts.map +1 -0
  221. package/dist/eval/types.js +2 -0
  222. package/dist/eval/types.js.map +1 -0
  223. package/dist/index.d.ts +4 -0
  224. package/dist/index.d.ts.map +1 -0
  225. package/dist/index.js +6 -0
  226. package/dist/index.js.map +1 -0
  227. package/dist/orchestration/index.d.ts +4 -0
  228. package/dist/orchestration/index.d.ts.map +1 -0
  229. package/dist/orchestration/index.js +3 -0
  230. package/dist/orchestration/index.js.map +1 -0
  231. package/dist/orchestration/plan-executor.d.ts +27 -0
  232. package/dist/orchestration/plan-executor.d.ts.map +1 -0
  233. package/dist/orchestration/plan-executor.js +536 -0
  234. package/dist/orchestration/plan-executor.js.map +1 -0
  235. package/dist/orchestration/types.d.ts +69 -0
  236. package/dist/orchestration/types.d.ts.map +1 -0
  237. package/dist/orchestration/types.js +2 -0
  238. package/dist/orchestration/types.js.map +1 -0
  239. package/dist/orchestration/utils.d.ts +14 -0
  240. package/dist/orchestration/utils.d.ts.map +1 -0
  241. package/dist/orchestration/utils.js +105 -0
  242. package/dist/orchestration/utils.js.map +1 -0
  243. package/dist/pipe/index.d.ts +2 -0
  244. package/dist/pipe/index.d.ts.map +1 -0
  245. package/dist/pipe/index.js +2 -0
  246. package/dist/pipe/index.js.map +1 -0
  247. package/dist/pipe/pipe-runner.d.ts +15 -0
  248. package/dist/pipe/pipe-runner.d.ts.map +1 -0
  249. package/dist/pipe/pipe-runner.js +207 -0
  250. package/dist/pipe/pipe-runner.js.map +1 -0
  251. package/dist/prompts/agents/planning.d.ts +4 -0
  252. package/dist/prompts/agents/planning.d.ts.map +1 -0
  253. package/dist/prompts/agents/planning.js +318 -0
  254. package/dist/prompts/agents/planning.js.map +1 -0
  255. package/dist/prompts/index.d.ts +8 -0
  256. package/dist/prompts/index.d.ts.map +1 -0
  257. package/dist/prompts/index.js +8 -0
  258. package/dist/prompts/index.js.map +1 -0
  259. package/dist/prompts/shared/codebase-rules.d.ts +4 -0
  260. package/dist/prompts/shared/codebase-rules.d.ts.map +1 -0
  261. package/dist/prompts/shared/codebase-rules.js +16 -0
  262. package/dist/prompts/shared/codebase-rules.js.map +1 -0
  263. package/dist/prompts/shared/git-rules.d.ts +2 -0
  264. package/dist/prompts/shared/git-rules.d.ts.map +1 -0
  265. package/dist/prompts/shared/git-rules.js +87 -0
  266. package/dist/prompts/shared/git-rules.js.map +1 -0
  267. package/dist/prompts/shared/language-rules.d.ts +4 -0
  268. package/dist/prompts/shared/language-rules.d.ts.map +1 -0
  269. package/dist/prompts/shared/language-rules.js +22 -0
  270. package/dist/prompts/shared/language-rules.js.map +1 -0
  271. package/dist/prompts/shared/tool-usage.d.ts +14 -0
  272. package/dist/prompts/shared/tool-usage.d.ts.map +1 -0
  273. package/dist/prompts/shared/tool-usage.js +92 -0
  274. package/dist/prompts/shared/tool-usage.js.map +1 -0
  275. package/dist/prompts/system/compact.d.ts +3 -0
  276. package/dist/prompts/system/compact.d.ts.map +1 -0
  277. package/dist/prompts/system/compact.js +73 -0
  278. package/dist/prompts/system/compact.js.map +1 -0
  279. package/dist/prompts/system/plan-execute.d.ts +6 -0
  280. package/dist/prompts/system/plan-execute.d.ts.map +1 -0
  281. package/dist/prompts/system/plan-execute.js +178 -0
  282. package/dist/prompts/system/plan-execute.js.map +1 -0
  283. package/dist/tools/browser/browser-client.d.ts +108 -0
  284. package/dist/tools/browser/browser-client.d.ts.map +1 -0
  285. package/dist/tools/browser/browser-client.js +965 -0
  286. package/dist/tools/browser/browser-client.js.map +1 -0
  287. package/dist/tools/browser/browser-tools.d.ts +18 -0
  288. package/dist/tools/browser/browser-tools.d.ts.map +1 -0
  289. package/dist/tools/browser/browser-tools.js +983 -0
  290. package/dist/tools/browser/browser-tools.js.map +1 -0
  291. package/dist/tools/browser/index.d.ts +7 -0
  292. package/dist/tools/browser/index.d.ts.map +1 -0
  293. package/dist/tools/browser/index.js +17 -0
  294. package/dist/tools/browser/index.js.map +1 -0
  295. package/dist/tools/index.d.ts +4 -0
  296. package/dist/tools/index.d.ts.map +1 -0
  297. package/dist/tools/index.js +4 -0
  298. package/dist/tools/index.js.map +1 -0
  299. package/dist/tools/llm/index.d.ts +2 -0
  300. package/dist/tools/llm/index.d.ts.map +1 -0
  301. package/dist/tools/llm/index.js +2 -0
  302. package/dist/tools/llm/index.js.map +1 -0
  303. package/dist/tools/llm/simple/ask-user-tool.d.ts +5 -0
  304. package/dist/tools/llm/simple/ask-user-tool.d.ts.map +1 -0
  305. package/dist/tools/llm/simple/ask-user-tool.js +7 -0
  306. package/dist/tools/llm/simple/ask-user-tool.js.map +1 -0
  307. package/dist/tools/llm/simple/background-bash-tool.d.ts +30 -0
  308. package/dist/tools/llm/simple/background-bash-tool.d.ts.map +1 -0
  309. package/dist/tools/llm/simple/background-bash-tool.js +320 -0
  310. package/dist/tools/llm/simple/background-bash-tool.js.map +1 -0
  311. package/dist/tools/llm/simple/background-powershell-tool.d.ts +30 -0
  312. package/dist/tools/llm/simple/background-powershell-tool.d.ts.map +1 -0
  313. package/dist/tools/llm/simple/background-powershell-tool.js +302 -0
  314. package/dist/tools/llm/simple/background-powershell-tool.js.map +1 -0
  315. package/dist/tools/llm/simple/bash-tool.d.ts +4 -0
  316. package/dist/tools/llm/simple/bash-tool.d.ts.map +1 -0
  317. package/dist/tools/llm/simple/bash-tool.js +167 -0
  318. package/dist/tools/llm/simple/bash-tool.js.map +1 -0
  319. package/dist/tools/llm/simple/file-tools.d.ts +13 -0
  320. package/dist/tools/llm/simple/file-tools.d.ts.map +1 -0
  321. package/dist/tools/llm/simple/file-tools.js +814 -0
  322. package/dist/tools/llm/simple/file-tools.js.map +1 -0
  323. package/dist/tools/llm/simple/final-response-tool.d.ts +12 -0
  324. package/dist/tools/llm/simple/final-response-tool.d.ts.map +1 -0
  325. package/dist/tools/llm/simple/final-response-tool.js +107 -0
  326. package/dist/tools/llm/simple/final-response-tool.js.map +1 -0
  327. package/dist/tools/llm/simple/index.d.ts +11 -0
  328. package/dist/tools/llm/simple/index.d.ts.map +1 -0
  329. package/dist/tools/llm/simple/index.js +20 -0
  330. package/dist/tools/llm/simple/index.js.map +1 -0
  331. package/dist/tools/llm/simple/planning-tools.d.ts +5 -0
  332. package/dist/tools/llm/simple/planning-tools.d.ts.map +1 -0
  333. package/dist/tools/llm/simple/planning-tools.js +121 -0
  334. package/dist/tools/llm/simple/planning-tools.js.map +1 -0
  335. package/dist/tools/llm/simple/powershell-tool.d.ts +4 -0
  336. package/dist/tools/llm/simple/powershell-tool.d.ts.map +1 -0
  337. package/dist/tools/llm/simple/powershell-tool.js +163 -0
  338. package/dist/tools/llm/simple/powershell-tool.js.map +1 -0
  339. package/dist/tools/llm/simple/read-image-tool.d.ts +8 -0
  340. package/dist/tools/llm/simple/read-image-tool.d.ts.map +1 -0
  341. package/dist/tools/llm/simple/read-image-tool.js +170 -0
  342. package/dist/tools/llm/simple/read-image-tool.js.map +1 -0
  343. package/dist/tools/llm/simple/simple-tool-executor.d.ts +40 -0
  344. package/dist/tools/llm/simple/simple-tool-executor.d.ts.map +1 -0
  345. package/dist/tools/llm/simple/simple-tool-executor.js +159 -0
  346. package/dist/tools/llm/simple/simple-tool-executor.js.map +1 -0
  347. package/dist/tools/llm/simple/todo-tools.d.ts +15 -0
  348. package/dist/tools/llm/simple/todo-tools.d.ts.map +1 -0
  349. package/dist/tools/llm/simple/todo-tools.js +145 -0
  350. package/dist/tools/llm/simple/todo-tools.js.map +1 -0
  351. package/dist/tools/llm/simple/user-interaction-tools.d.ts +22 -0
  352. package/dist/tools/llm/simple/user-interaction-tools.d.ts.map +1 -0
  353. package/dist/tools/llm/simple/user-interaction-tools.js +168 -0
  354. package/dist/tools/llm/simple/user-interaction-tools.js.map +1 -0
  355. package/dist/tools/office/common/constants.d.ts +192 -0
  356. package/dist/tools/office/common/constants.d.ts.map +1 -0
  357. package/dist/tools/office/common/constants.js +165 -0
  358. package/dist/tools/office/common/constants.js.map +1 -0
  359. package/dist/tools/office/common/index.d.ts +4 -0
  360. package/dist/tools/office/common/index.d.ts.map +1 -0
  361. package/dist/tools/office/common/index.js +3 -0
  362. package/dist/tools/office/common/index.js.map +1 -0
  363. package/dist/tools/office/common/types.d.ts +82 -0
  364. package/dist/tools/office/common/types.d.ts.map +1 -0
  365. package/dist/tools/office/common/types.js +2 -0
  366. package/dist/tools/office/common/types.js.map +1 -0
  367. package/dist/tools/office/common/utils.d.ts +16 -0
  368. package/dist/tools/office/common/utils.d.ts.map +1 -0
  369. package/dist/tools/office/common/utils.js +60 -0
  370. package/dist/tools/office/common/utils.js.map +1 -0
  371. package/dist/tools/office/excel-client.d.ts +219 -0
  372. package/dist/tools/office/excel-client.d.ts.map +1 -0
  373. package/dist/tools/office/excel-client.js +2346 -0
  374. package/dist/tools/office/excel-client.js.map +1 -0
  375. package/dist/tools/office/excel-tools/cells.d.ts +10 -0
  376. package/dist/tools/office/excel-tools/cells.d.ts.map +1 -0
  377. package/dist/tools/office/excel-tools/cells.js +283 -0
  378. package/dist/tools/office/excel-tools/cells.js.map +1 -0
  379. package/dist/tools/office/excel-tools/charts.d.ts +6 -0
  380. package/dist/tools/office/excel-tools/charts.d.ts.map +1 -0
  381. package/dist/tools/office/excel-tools/charts.js +124 -0
  382. package/dist/tools/office/excel-tools/charts.js.map +1 -0
  383. package/dist/tools/office/excel-tools/comments.d.ts +6 -0
  384. package/dist/tools/office/excel-tools/comments.d.ts.map +1 -0
  385. package/dist/tools/office/excel-tools/comments.js +114 -0
  386. package/dist/tools/office/excel-tools/comments.js.map +1 -0
  387. package/dist/tools/office/excel-tools/data-ops.d.ts +10 -0
  388. package/dist/tools/office/excel-tools/data-ops.d.ts.map +1 -0
  389. package/dist/tools/office/excel-tools/data-ops.js +266 -0
  390. package/dist/tools/office/excel-tools/data-ops.js.map +1 -0
  391. package/dist/tools/office/excel-tools/export.d.ts +5 -0
  392. package/dist/tools/office/excel-tools/export.d.ts.map +1 -0
  393. package/dist/tools/office/excel-tools/export.js +75 -0
  394. package/dist/tools/office/excel-tools/export.js.map +1 -0
  395. package/dist/tools/office/excel-tools/formatting.d.ts +10 -0
  396. package/dist/tools/office/excel-tools/formatting.d.ts.map +1 -0
  397. package/dist/tools/office/excel-tools/formatting.js +276 -0
  398. package/dist/tools/office/excel-tools/formatting.js.map +1 -0
  399. package/dist/tools/office/excel-tools/index.d.ts +18 -0
  400. package/dist/tools/office/excel-tools/index.d.ts.map +1 -0
  401. package/dist/tools/office/excel-tools/index.js +54 -0
  402. package/dist/tools/office/excel-tools/index.js.map +1 -0
  403. package/dist/tools/office/excel-tools/launch.d.ts +10 -0
  404. package/dist/tools/office/excel-tools/launch.d.ts.map +1 -0
  405. package/dist/tools/office/excel-tools/launch.js +250 -0
  406. package/dist/tools/office/excel-tools/launch.js.map +1 -0
  407. package/dist/tools/office/excel-tools/media.d.ts +5 -0
  408. package/dist/tools/office/excel-tools/media.d.ts.map +1 -0
  409. package/dist/tools/office/excel-tools/media.js +84 -0
  410. package/dist/tools/office/excel-tools/media.js.map +1 -0
  411. package/dist/tools/office/excel-tools/named-ranges.d.ts +6 -0
  412. package/dist/tools/office/excel-tools/named-ranges.d.ts.map +1 -0
  413. package/dist/tools/office/excel-tools/named-ranges.js +113 -0
  414. package/dist/tools/office/excel-tools/named-ranges.js.map +1 -0
  415. package/dist/tools/office/excel-tools/protection.d.ts +5 -0
  416. package/dist/tools/office/excel-tools/protection.d.ts.map +1 -0
  417. package/dist/tools/office/excel-tools/protection.js +75 -0
  418. package/dist/tools/office/excel-tools/protection.js.map +1 -0
  419. package/dist/tools/office/excel-tools/rows-columns.d.ts +11 -0
  420. package/dist/tools/office/excel-tools/rows-columns.d.ts.map +1 -0
  421. package/dist/tools/office/excel-tools/rows-columns.js +293 -0
  422. package/dist/tools/office/excel-tools/rows-columns.js.map +1 -0
  423. package/dist/tools/office/excel-tools/sheet-builders.d.ts +9 -0
  424. package/dist/tools/office/excel-tools/sheet-builders.d.ts.map +1 -0
  425. package/dist/tools/office/excel-tools/sheet-builders.js +483 -0
  426. package/dist/tools/office/excel-tools/sheet-builders.js.map +1 -0
  427. package/dist/tools/office/excel-tools/sheets.d.ts +8 -0
  428. package/dist/tools/office/excel-tools/sheets.d.ts.map +1 -0
  429. package/dist/tools/office/excel-tools/sheets.js +182 -0
  430. package/dist/tools/office/excel-tools/sheets.js.map +1 -0
  431. package/dist/tools/office/excel-tools/validation.d.ts +7 -0
  432. package/dist/tools/office/excel-tools/validation.d.ts.map +1 -0
  433. package/dist/tools/office/excel-tools/validation.js +175 -0
  434. package/dist/tools/office/excel-tools/validation.js.map +1 -0
  435. package/dist/tools/office/excel-tools.d.ts +3 -0
  436. package/dist/tools/office/excel-tools.d.ts.map +1 -0
  437. package/dist/tools/office/excel-tools.js +3 -0
  438. package/dist/tools/office/excel-tools.js.map +1 -0
  439. package/dist/tools/office/index.d.ts +6 -0
  440. package/dist/tools/office/index.d.ts.map +1 -0
  441. package/dist/tools/office/index.js +9 -0
  442. package/dist/tools/office/index.js.map +1 -0
  443. package/dist/tools/office/office-client-base.d.ts +33 -0
  444. package/dist/tools/office/office-client-base.d.ts.map +1 -0
  445. package/dist/tools/office/office-client-base.js +166 -0
  446. package/dist/tools/office/office-client-base.js.map +1 -0
  447. package/dist/tools/office/office-client.d.ts +196 -0
  448. package/dist/tools/office/office-client.d.ts.map +1 -0
  449. package/dist/tools/office/office-client.js +200 -0
  450. package/dist/tools/office/office-client.js.map +1 -0
  451. package/dist/tools/office/powerpoint-client.d.ts +148 -0
  452. package/dist/tools/office/powerpoint-client.d.ts.map +1 -0
  453. package/dist/tools/office/powerpoint-client.js +1310 -0
  454. package/dist/tools/office/powerpoint-client.js.map +1 -0
  455. package/dist/tools/office/powerpoint-tools/effects.d.ts +9 -0
  456. package/dist/tools/office/powerpoint-tools/effects.d.ts.map +1 -0
  457. package/dist/tools/office/powerpoint-tools/effects.js +246 -0
  458. package/dist/tools/office/powerpoint-tools/effects.js.map +1 -0
  459. package/dist/tools/office/powerpoint-tools/export.d.ts +6 -0
  460. package/dist/tools/office/powerpoint-tools/export.d.ts.map +1 -0
  461. package/dist/tools/office/powerpoint-tools/export.js +123 -0
  462. package/dist/tools/office/powerpoint-tools/export.js.map +1 -0
  463. package/dist/tools/office/powerpoint-tools/index.d.ts +15 -0
  464. package/dist/tools/office/powerpoint-tools/index.d.ts.map +1 -0
  465. package/dist/tools/office/powerpoint-tools/index.js +40 -0
  466. package/dist/tools/office/powerpoint-tools/index.js.map +1 -0
  467. package/dist/tools/office/powerpoint-tools/launch.d.ts +9 -0
  468. package/dist/tools/office/powerpoint-tools/launch.d.ts.map +1 -0
  469. package/dist/tools/office/powerpoint-tools/launch.js +218 -0
  470. package/dist/tools/office/powerpoint-tools/launch.js.map +1 -0
  471. package/dist/tools/office/powerpoint-tools/layout-builders.d.ts +12 -0
  472. package/dist/tools/office/powerpoint-tools/layout-builders.d.ts.map +1 -0
  473. package/dist/tools/office/powerpoint-tools/layout-builders.js +785 -0
  474. package/dist/tools/office/powerpoint-tools/layout-builders.js.map +1 -0
  475. package/dist/tools/office/powerpoint-tools/media.d.ts +8 -0
  476. package/dist/tools/office/powerpoint-tools/media.d.ts.map +1 -0
  477. package/dist/tools/office/powerpoint-tools/media.js +211 -0
  478. package/dist/tools/office/powerpoint-tools/media.js.map +1 -0
  479. package/dist/tools/office/powerpoint-tools/notes.d.ts +8 -0
  480. package/dist/tools/office/powerpoint-tools/notes.d.ts.map +1 -0
  481. package/dist/tools/office/powerpoint-tools/notes.js +171 -0
  482. package/dist/tools/office/powerpoint-tools/notes.js.map +1 -0
  483. package/dist/tools/office/powerpoint-tools/sections.d.ts +6 -0
  484. package/dist/tools/office/powerpoint-tools/sections.d.ts.map +1 -0
  485. package/dist/tools/office/powerpoint-tools/sections.js +104 -0
  486. package/dist/tools/office/powerpoint-tools/sections.js.map +1 -0
  487. package/dist/tools/office/powerpoint-tools/shapes.d.ts +22 -0
  488. package/dist/tools/office/powerpoint-tools/shapes.d.ts.map +1 -0
  489. package/dist/tools/office/powerpoint-tools/shapes.js +681 -0
  490. package/dist/tools/office/powerpoint-tools/shapes.js.map +1 -0
  491. package/dist/tools/office/powerpoint-tools/slides.d.ts +11 -0
  492. package/dist/tools/office/powerpoint-tools/slides.d.ts.map +1 -0
  493. package/dist/tools/office/powerpoint-tools/slides.js +283 -0
  494. package/dist/tools/office/powerpoint-tools/slides.js.map +1 -0
  495. package/dist/tools/office/powerpoint-tools/tables.d.ts +6 -0
  496. package/dist/tools/office/powerpoint-tools/tables.d.ts.map +1 -0
  497. package/dist/tools/office/powerpoint-tools/tables.js +132 -0
  498. package/dist/tools/office/powerpoint-tools/tables.js.map +1 -0
  499. package/dist/tools/office/powerpoint-tools/text.d.ts +12 -0
  500. package/dist/tools/office/powerpoint-tools/text.d.ts.map +1 -0
  501. package/dist/tools/office/powerpoint-tools/text.js +379 -0
  502. package/dist/tools/office/powerpoint-tools/text.js.map +1 -0
  503. package/dist/tools/office/powerpoint-tools.d.ts +3 -0
  504. package/dist/tools/office/powerpoint-tools.d.ts.map +1 -0
  505. package/dist/tools/office/powerpoint-tools.js +3 -0
  506. package/dist/tools/office/powerpoint-tools.js.map +1 -0
  507. package/dist/tools/office/word-client.d.ts +169 -0
  508. package/dist/tools/office/word-client.d.ts.map +1 -0
  509. package/dist/tools/office/word-client.js +1636 -0
  510. package/dist/tools/office/word-client.js.map +1 -0
  511. package/dist/tools/office/word-tools/bookmarks.d.ts +7 -0
  512. package/dist/tools/office/word-tools/bookmarks.d.ts.map +1 -0
  513. package/dist/tools/office/word-tools/bookmarks.js +146 -0
  514. package/dist/tools/office/word-tools/bookmarks.js.map +1 -0
  515. package/dist/tools/office/word-tools/comments.d.ts +7 -0
  516. package/dist/tools/office/word-tools/comments.d.ts.map +1 -0
  517. package/dist/tools/office/word-tools/comments.js +146 -0
  518. package/dist/tools/office/word-tools/comments.js.map +1 -0
  519. package/dist/tools/office/word-tools/content.d.ts +7 -0
  520. package/dist/tools/office/word-tools/content.d.ts.map +1 -0
  521. package/dist/tools/office/word-tools/content.js +168 -0
  522. package/dist/tools/office/word-tools/content.js.map +1 -0
  523. package/dist/tools/office/word-tools/export.d.ts +5 -0
  524. package/dist/tools/office/word-tools/export.d.ts.map +1 -0
  525. package/dist/tools/office/word-tools/export.js +73 -0
  526. package/dist/tools/office/word-tools/export.js.map +1 -0
  527. package/dist/tools/office/word-tools/formatting.d.ts +6 -0
  528. package/dist/tools/office/word-tools/formatting.d.ts.map +1 -0
  529. package/dist/tools/office/word-tools/formatting.js +129 -0
  530. package/dist/tools/office/word-tools/formatting.js.map +1 -0
  531. package/dist/tools/office/word-tools/headers-footers.d.ts +6 -0
  532. package/dist/tools/office/word-tools/headers-footers.d.ts.map +1 -0
  533. package/dist/tools/office/word-tools/headers-footers.js +117 -0
  534. package/dist/tools/office/word-tools/headers-footers.js.map +1 -0
  535. package/dist/tools/office/word-tools/index.d.ts +19 -0
  536. package/dist/tools/office/word-tools/index.d.ts.map +1 -0
  537. package/dist/tools/office/word-tools/index.js +60 -0
  538. package/dist/tools/office/word-tools/index.js.map +1 -0
  539. package/dist/tools/office/word-tools/launch.d.ts +10 -0
  540. package/dist/tools/office/word-tools/launch.d.ts.map +1 -0
  541. package/dist/tools/office/word-tools/launch.js +257 -0
  542. package/dist/tools/office/word-tools/launch.js.map +1 -0
  543. package/dist/tools/office/word-tools/lists.d.ts +5 -0
  544. package/dist/tools/office/word-tools/lists.d.ts.map +1 -0
  545. package/dist/tools/office/word-tools/lists.js +73 -0
  546. package/dist/tools/office/word-tools/lists.js.map +1 -0
  547. package/dist/tools/office/word-tools/navigation.d.ts +5 -0
  548. package/dist/tools/office/word-tools/navigation.d.ts.map +1 -0
  549. package/dist/tools/office/word-tools/navigation.js +85 -0
  550. package/dist/tools/office/word-tools/navigation.js.map +1 -0
  551. package/dist/tools/office/word-tools/page-setup.d.ts +7 -0
  552. package/dist/tools/office/word-tools/page-setup.d.ts.map +1 -0
  553. package/dist/tools/office/word-tools/page-setup.js +152 -0
  554. package/dist/tools/office/word-tools/page-setup.js.map +1 -0
  555. package/dist/tools/office/word-tools/section-builders.d.ts +12 -0
  556. package/dist/tools/office/word-tools/section-builders.d.ts.map +1 -0
  557. package/dist/tools/office/word-tools/section-builders.js +601 -0
  558. package/dist/tools/office/word-tools/section-builders.js.map +1 -0
  559. package/dist/tools/office/word-tools/tables.d.ts +8 -0
  560. package/dist/tools/office/word-tools/tables.d.ts.map +1 -0
  561. package/dist/tools/office/word-tools/tables.js +197 -0
  562. package/dist/tools/office/word-tools/tables.js.map +1 -0
  563. package/dist/tools/office/word-tools/text.d.ts +9 -0
  564. package/dist/tools/office/word-tools/text.d.ts.map +1 -0
  565. package/dist/tools/office/word-tools/text.js +245 -0
  566. package/dist/tools/office/word-tools/text.js.map +1 -0
  567. package/dist/tools/office/word-tools/undo-redo.d.ts +5 -0
  568. package/dist/tools/office/word-tools/undo-redo.d.ts.map +1 -0
  569. package/dist/tools/office/word-tools/undo-redo.js +73 -0
  570. package/dist/tools/office/word-tools/undo-redo.js.map +1 -0
  571. package/dist/tools/office/word-tools/watermarks.d.ts +5 -0
  572. package/dist/tools/office/word-tools/watermarks.d.ts.map +1 -0
  573. package/dist/tools/office/word-tools/watermarks.js +81 -0
  574. package/dist/tools/office/word-tools/watermarks.js.map +1 -0
  575. package/dist/tools/office/word-tools.d.ts +3 -0
  576. package/dist/tools/office/word-tools.d.ts.map +1 -0
  577. package/dist/tools/office/word-tools.js +3 -0
  578. package/dist/tools/office/word-tools.js.map +1 -0
  579. package/dist/tools/registry.d.ts +55 -0
  580. package/dist/tools/registry.d.ts.map +1 -0
  581. package/dist/tools/registry.js +296 -0
  582. package/dist/tools/registry.js.map +1 -0
  583. package/dist/tools/types.d.ts +88 -0
  584. package/dist/tools/types.d.ts.map +1 -0
  585. package/dist/tools/types.js +19 -0
  586. package/dist/tools/types.js.map +1 -0
  587. package/dist/types/index.d.ts +132 -0
  588. package/dist/types/index.d.ts.map +1 -0
  589. package/dist/types/index.js +2 -0
  590. package/dist/types/index.js.map +1 -0
  591. package/dist/ui/PlanExecuteView.d.ts +11 -0
  592. package/dist/ui/PlanExecuteView.d.ts.map +1 -0
  593. package/dist/ui/PlanExecuteView.js +27 -0
  594. package/dist/ui/PlanExecuteView.js.map +1 -0
  595. package/dist/ui/TodoPanel.d.ts +13 -0
  596. package/dist/ui/TodoPanel.d.ts.map +1 -0
  597. package/dist/ui/TodoPanel.js +138 -0
  598. package/dist/ui/TodoPanel.js.map +1 -0
  599. package/dist/ui/UpdateNotification.d.ts +13 -0
  600. package/dist/ui/UpdateNotification.d.ts.map +1 -0
  601. package/dist/ui/UpdateNotification.js +42 -0
  602. package/dist/ui/UpdateNotification.js.map +1 -0
  603. package/dist/ui/components/ActivityIndicator.d.ts +25 -0
  604. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -0
  605. package/dist/ui/components/ActivityIndicator.js +116 -0
  606. package/dist/ui/components/ActivityIndicator.js.map +1 -0
  607. package/dist/ui/components/CommandBrowser.d.ts +10 -0
  608. package/dist/ui/components/CommandBrowser.d.ts.map +1 -0
  609. package/dist/ui/components/CommandBrowser.js +57 -0
  610. package/dist/ui/components/CommandBrowser.js.map +1 -0
  611. package/dist/ui/components/CustomTextInput.d.ts +13 -0
  612. package/dist/ui/components/CustomTextInput.d.ts.map +1 -0
  613. package/dist/ui/components/CustomTextInput.js +246 -0
  614. package/dist/ui/components/CustomTextInput.js.map +1 -0
  615. package/dist/ui/components/FileBrowser.d.ts +11 -0
  616. package/dist/ui/components/FileBrowser.d.ts.map +1 -0
  617. package/dist/ui/components/FileBrowser.js +45 -0
  618. package/dist/ui/components/FileBrowser.js.map +1 -0
  619. package/dist/ui/components/LLMSetupWizard.d.ts +8 -0
  620. package/dist/ui/components/LLMSetupWizard.d.ts.map +1 -0
  621. package/dist/ui/components/LLMSetupWizard.js +197 -0
  622. package/dist/ui/components/LLMSetupWizard.js.map +1 -0
  623. package/dist/ui/components/Logo.d.ts +20 -0
  624. package/dist/ui/components/Logo.d.ts.map +1 -0
  625. package/dist/ui/components/Logo.js +100 -0
  626. package/dist/ui/components/Logo.js.map +1 -0
  627. package/dist/ui/components/MarkdownRenderer.d.ts +9 -0
  628. package/dist/ui/components/MarkdownRenderer.d.ts.map +1 -0
  629. package/dist/ui/components/MarkdownRenderer.js +198 -0
  630. package/dist/ui/components/MarkdownRenderer.js.map +1 -0
  631. package/dist/ui/components/ModelSelector.d.ts +8 -0
  632. package/dist/ui/components/ModelSelector.d.ts.map +1 -0
  633. package/dist/ui/components/ModelSelector.js +111 -0
  634. package/dist/ui/components/ModelSelector.js.map +1 -0
  635. package/dist/ui/components/PlanExecuteApp.d.ts +23 -0
  636. package/dist/ui/components/PlanExecuteApp.d.ts.map +1 -0
  637. package/dist/ui/components/PlanExecuteApp.js +1377 -0
  638. package/dist/ui/components/PlanExecuteApp.js.map +1 -0
  639. package/dist/ui/components/ProgressBar.d.ts +10 -0
  640. package/dist/ui/components/ProgressBar.d.ts.map +1 -0
  641. package/dist/ui/components/ProgressBar.js +26 -0
  642. package/dist/ui/components/ProgressBar.js.map +1 -0
  643. package/dist/ui/components/StatusBar.d.ts +23 -0
  644. package/dist/ui/components/StatusBar.d.ts.map +1 -0
  645. package/dist/ui/components/StatusBar.js +162 -0
  646. package/dist/ui/components/StatusBar.js.map +1 -0
  647. package/dist/ui/components/ThinkingIndicator.d.ts +14 -0
  648. package/dist/ui/components/ThinkingIndicator.d.ts.map +1 -0
  649. package/dist/ui/components/ThinkingIndicator.js +63 -0
  650. package/dist/ui/components/ThinkingIndicator.js.map +1 -0
  651. package/dist/ui/components/TodoListView.d.ts +11 -0
  652. package/dist/ui/components/TodoListView.d.ts.map +1 -0
  653. package/dist/ui/components/TodoListView.js +69 -0
  654. package/dist/ui/components/TodoListView.js.map +1 -0
  655. package/dist/ui/components/ToolSelector.d.ts +7 -0
  656. package/dist/ui/components/ToolSelector.d.ts.map +1 -0
  657. package/dist/ui/components/ToolSelector.js +112 -0
  658. package/dist/ui/components/ToolSelector.js.map +1 -0
  659. package/dist/ui/components/dialogs/ApprovalDialog.d.ts +13 -0
  660. package/dist/ui/components/dialogs/ApprovalDialog.d.ts.map +1 -0
  661. package/dist/ui/components/dialogs/ApprovalDialog.js +175 -0
  662. package/dist/ui/components/dialogs/ApprovalDialog.js.map +1 -0
  663. package/dist/ui/components/dialogs/AskUserDialog.d.ts +9 -0
  664. package/dist/ui/components/dialogs/AskUserDialog.d.ts.map +1 -0
  665. package/dist/ui/components/dialogs/AskUserDialog.js +111 -0
  666. package/dist/ui/components/dialogs/AskUserDialog.js.map +1 -0
  667. package/dist/ui/components/dialogs/DocsBrowser.d.ts +8 -0
  668. package/dist/ui/components/dialogs/DocsBrowser.d.ts.map +1 -0
  669. package/dist/ui/components/dialogs/DocsBrowser.js +127 -0
  670. package/dist/ui/components/dialogs/DocsBrowser.js.map +1 -0
  671. package/dist/ui/components/dialogs/SettingsDialog.d.ts +10 -0
  672. package/dist/ui/components/dialogs/SettingsDialog.d.ts.map +1 -0
  673. package/dist/ui/components/dialogs/SettingsDialog.js +586 -0
  674. package/dist/ui/components/dialogs/SettingsDialog.js.map +1 -0
  675. package/dist/ui/components/dialogs/index.d.ts +3 -0
  676. package/dist/ui/components/dialogs/index.d.ts.map +1 -0
  677. package/dist/ui/components/dialogs/index.js +3 -0
  678. package/dist/ui/components/dialogs/index.js.map +1 -0
  679. package/dist/ui/components/index.d.ts +12 -0
  680. package/dist/ui/components/index.d.ts.map +1 -0
  681. package/dist/ui/components/index.js +9 -0
  682. package/dist/ui/components/index.js.map +1 -0
  683. package/dist/ui/components/panels/LogPanel.d.ts +7 -0
  684. package/dist/ui/components/panels/LogPanel.d.ts.map +1 -0
  685. package/dist/ui/components/panels/LogPanel.js +280 -0
  686. package/dist/ui/components/panels/LogPanel.js.map +1 -0
  687. package/dist/ui/components/panels/SessionPanel.d.ts +8 -0
  688. package/dist/ui/components/panels/SessionPanel.d.ts.map +1 -0
  689. package/dist/ui/components/panels/SessionPanel.js +81 -0
  690. package/dist/ui/components/panels/SessionPanel.js.map +1 -0
  691. package/dist/ui/components/panels/index.d.ts +4 -0
  692. package/dist/ui/components/panels/index.d.ts.map +1 -0
  693. package/dist/ui/components/panels/index.js +4 -0
  694. package/dist/ui/components/panels/index.js.map +1 -0
  695. package/dist/ui/components/views/ChatView.d.ts +12 -0
  696. package/dist/ui/components/views/ChatView.d.ts.map +1 -0
  697. package/dist/ui/components/views/ChatView.js +289 -0
  698. package/dist/ui/components/views/ChatView.js.map +1 -0
  699. package/dist/ui/components/views/index.d.ts +2 -0
  700. package/dist/ui/components/views/index.d.ts.map +1 -0
  701. package/dist/ui/components/views/index.js +2 -0
  702. package/dist/ui/components/views/index.js.map +1 -0
  703. package/dist/ui/contexts/TokenContext.d.ts +29 -0
  704. package/dist/ui/contexts/TokenContext.d.ts.map +1 -0
  705. package/dist/ui/contexts/TokenContext.js +79 -0
  706. package/dist/ui/contexts/TokenContext.js.map +1 -0
  707. package/dist/ui/hooks/atFileProcessor.d.ts +15 -0
  708. package/dist/ui/hooks/atFileProcessor.d.ts.map +1 -0
  709. package/dist/ui/hooks/atFileProcessor.js +88 -0
  710. package/dist/ui/hooks/atFileProcessor.js.map +1 -0
  711. package/dist/ui/hooks/index.d.ts +9 -0
  712. package/dist/ui/hooks/index.d.ts.map +1 -0
  713. package/dist/ui/hooks/index.js +9 -0
  714. package/dist/ui/hooks/index.js.map +1 -0
  715. package/dist/ui/hooks/slashCommandProcessor.d.ts +21 -0
  716. package/dist/ui/hooks/slashCommandProcessor.d.ts.map +1 -0
  717. package/dist/ui/hooks/slashCommandProcessor.js +96 -0
  718. package/dist/ui/hooks/slashCommandProcessor.js.map +1 -0
  719. package/dist/ui/hooks/useCommandBrowserState.d.ts +12 -0
  720. package/dist/ui/hooks/useCommandBrowserState.d.ts.map +1 -0
  721. package/dist/ui/hooks/useCommandBrowserState.js +66 -0
  722. package/dist/ui/hooks/useCommandBrowserState.js.map +1 -0
  723. package/dist/ui/hooks/useFileBrowserState.d.ts +15 -0
  724. package/dist/ui/hooks/useFileBrowserState.d.ts.map +1 -0
  725. package/dist/ui/hooks/useFileBrowserState.js +80 -0
  726. package/dist/ui/hooks/useFileBrowserState.js.map +1 -0
  727. package/dist/ui/hooks/useFileList.d.ts +20 -0
  728. package/dist/ui/hooks/useFileList.d.ts.map +1 -0
  729. package/dist/ui/hooks/useFileList.js +57 -0
  730. package/dist/ui/hooks/useFileList.js.map +1 -0
  731. package/dist/ui/hooks/useInputHistory.d.ts +9 -0
  732. package/dist/ui/hooks/useInputHistory.d.ts.map +1 -0
  733. package/dist/ui/hooks/useInputHistory.js +68 -0
  734. package/dist/ui/hooks/useInputHistory.js.map +1 -0
  735. package/dist/ui/hooks/usePlanExecution.d.ts +8 -0
  736. package/dist/ui/hooks/usePlanExecution.d.ts.map +1 -0
  737. package/dist/ui/hooks/usePlanExecution.js +218 -0
  738. package/dist/ui/hooks/usePlanExecution.js.map +1 -0
  739. package/dist/ui/hooks/useTerminalWidth.d.ts +4 -0
  740. package/dist/ui/hooks/useTerminalWidth.d.ts.map +1 -0
  741. package/dist/ui/hooks/useTerminalWidth.js +26 -0
  742. package/dist/ui/hooks/useTerminalWidth.js.map +1 -0
  743. package/dist/ui/index.d.ts +7 -0
  744. package/dist/ui/index.d.ts.map +1 -0
  745. package/dist/ui/index.js +7 -0
  746. package/dist/ui/index.js.map +1 -0
  747. package/dist/ui/ink-entry.d.ts +3 -0
  748. package/dist/ui/ink-entry.d.ts.map +1 -0
  749. package/dist/ui/ink-entry.js +22 -0
  750. package/dist/ui/ink-entry.js.map +1 -0
  751. package/dist/utils/file-system.d.ts +9 -0
  752. package/dist/utils/file-system.d.ts.map +1 -0
  753. package/dist/utils/file-system.js +99 -0
  754. package/dist/utils/file-system.js.map +1 -0
  755. package/dist/utils/git-utils.d.ts +2 -0
  756. package/dist/utils/git-utils.d.ts.map +1 -0
  757. package/dist/utils/git-utils.js +16 -0
  758. package/dist/utils/git-utils.js.map +1 -0
  759. package/dist/utils/json-stream-logger.d.ts +74 -0
  760. package/dist/utils/json-stream-logger.d.ts.map +1 -0
  761. package/dist/utils/json-stream-logger.js +808 -0
  762. package/dist/utils/json-stream-logger.js.map +1 -0
  763. package/dist/utils/logger.d.ts +152 -0
  764. package/dist/utils/logger.d.ts.map +1 -0
  765. package/dist/utils/logger.js +1672 -0
  766. package/dist/utils/logger.js.map +1 -0
  767. package/dist/utils/platform-utils.d.ts +19 -0
  768. package/dist/utils/platform-utils.d.ts.map +1 -0
  769. package/dist/utils/platform-utils.js +134 -0
  770. package/dist/utils/platform-utils.js.map +1 -0
  771. package/dist/utils/wsl-utils.d.ts +4 -0
  772. package/dist/utils/wsl-utils.d.ts.map +1 -0
  773. package/dist/utils/wsl-utils.js +72 -0
  774. package/dist/utils/wsl-utils.js.map +1 -0
  775. package/package.json +132 -0
  776. package/scripts/patch-yoga.js +48 -0
@@ -0,0 +1,1636 @@
1
+ import { OfficeClientBase } from './office-client-base.js';
2
+ export class WordClient extends OfficeClientBase {
3
+ comProgId = 'Word.Application';
4
+ displayAlertsSuppressExpr = '0';
5
+ async wordLaunch() {
6
+ return this.executePowerShell(`
7
+ try {
8
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
9
+ $word.Visible = -1 # msoTrue
10
+ @{ success = $true; message = "Connected to existing Word instance" } | ConvertTo-Json -Compress
11
+ } catch {
12
+ $word = New-Object -ComObject Word.Application
13
+ $word.Visible = -1 # msoTrue
14
+ @{ success = $true; message = "Launched new Word instance" } | ConvertTo-Json -Compress
15
+ }
16
+ `);
17
+ }
18
+ async wordCreate() {
19
+ return this.executePowerShell(`
20
+ try {
21
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
22
+ } catch {
23
+ $word = New-Object -ComObject Word.Application
24
+ }
25
+ $word.DisplayAlerts = 0
26
+ $word.Visible = -1 # msoTrue
27
+ $doc = $word.Documents.Add()
28
+ $word.DisplayAlerts = -1
29
+ @{ success = $true; message = "Created new document"; document_name = $doc.Name } | ConvertTo-Json -Compress
30
+ `);
31
+ }
32
+ async wordWrite(text, options) {
33
+ const hasKorean = /[가-힣ㄱ-ㅎㅏ-ㅣ]/.test(text);
34
+ let fontName = options?.fontName?.replace(/'/g, "''") || '';
35
+ if (!fontName && hasKorean) {
36
+ fontName = 'Malgun Gothic';
37
+ }
38
+ const fontSize = options?.fontSize || 0;
39
+ const bold = options?.bold ? '$true' : '$false';
40
+ const italic = options?.italic ? '$true' : '$false';
41
+ const newParagraph = options?.newParagraph !== false;
42
+ const lines = text.split(/\\n|\n/);
43
+ const typeCommands = lines.map((line, index) => {
44
+ const isLastLine = index === lines.length - 1;
45
+ const base64Line = this.encodeTextForPowerShell(line);
46
+ const decodeExpr = `[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('${base64Line}'))`;
47
+ if (isLastLine && !newParagraph) {
48
+ return `$selection.TypeText(${decodeExpr})`;
49
+ }
50
+ else {
51
+ return `$selection.TypeText(${decodeExpr})\n$selection.TypeParagraph()`;
52
+ }
53
+ }).join('\n');
54
+ const postFormatCmds = [];
55
+ if (options?.styleName) {
56
+ const styleIdMap = {
57
+ 'Normal': -1, 'Heading 1': -2, 'Heading 2': -3, 'Heading 3': -4,
58
+ 'Heading 4': -5, 'Heading 5': -6,
59
+ };
60
+ const styleId = styleIdMap[options.styleName];
61
+ if (styleId !== undefined) {
62
+ postFormatCmds.push(`$typedRange.Style = $doc.Styles.Item(${styleId})`);
63
+ }
64
+ else {
65
+ const escapedStyle = options.styleName.replace(/'/g, "''");
66
+ postFormatCmds.push(`$typedRange.Style = '${escapedStyle}'`);
67
+ }
68
+ }
69
+ if (options?.color) {
70
+ const hex = options.color.replace('#', '');
71
+ const r = parseInt(hex.substring(0, 2), 16);
72
+ const g = parseInt(hex.substring(2, 4), 16);
73
+ const b = parseInt(hex.substring(4, 6), 16);
74
+ const rgb = r + g * 256 + b * 65536;
75
+ postFormatCmds.push(`$typedRange.Font.Color = ${rgb}`);
76
+ }
77
+ const alignMap = { left: 0, center: 1, right: 2, justify: 3 };
78
+ if (options?.alignment) {
79
+ postFormatCmds.push(`$typedRange.ParagraphFormat.Alignment = ${alignMap[options.alignment]}`);
80
+ }
81
+ if (options?.spaceBefore != null) {
82
+ postFormatCmds.push(`$typedRange.ParagraphFormat.SpaceBefore = ${options.spaceBefore}`);
83
+ }
84
+ if (options?.spaceAfter != null) {
85
+ postFormatCmds.push(`$typedRange.ParagraphFormat.SpaceAfter = ${options.spaceAfter}`);
86
+ }
87
+ if (options?.lineSpacing) {
88
+ postFormatCmds.push(`$typedRange.ParagraphFormat.LineSpacingRule = 5`);
89
+ postFormatCmds.push(`$typedRange.ParagraphFormat.LineSpacing = ${options.lineSpacing * 12}`);
90
+ }
91
+ if (options?.bgColor) {
92
+ const bgHex = options.bgColor.replace('#', '');
93
+ const bgR = parseInt(bgHex.substring(0, 2), 16);
94
+ const bgG = parseInt(bgHex.substring(2, 4), 16);
95
+ const bgB = parseInt(bgHex.substring(4, 6), 16);
96
+ postFormatCmds.push(`$typedRange.Shading.BackgroundPatternColor = ${bgR + bgG * 256 + bgB * 65536}`);
97
+ }
98
+ if (options?.leftBorderColor) {
99
+ const lbHex = options.leftBorderColor.replace('#', '');
100
+ const lbR = parseInt(lbHex.substring(0, 2), 16);
101
+ const lbG = parseInt(lbHex.substring(2, 4), 16);
102
+ const lbB = parseInt(lbHex.substring(4, 6), 16);
103
+ const lbWidth = (options.leftBorderWidth || 3) * 8;
104
+ postFormatCmds.push(`$typedRange.ParagraphFormat.Borders(-2).LineStyle = 1`);
105
+ postFormatCmds.push(`$typedRange.ParagraphFormat.Borders(-2).LineWidth = ${lbWidth}`);
106
+ postFormatCmds.push(`$typedRange.ParagraphFormat.Borders(-2).Color = ${lbR + lbG * 256 + lbB * 65536}`);
107
+ postFormatCmds.push(`$typedRange.ParagraphFormat.LeftIndent = 8`);
108
+ }
109
+ return this.executePowerShell(`
110
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
111
+ $doc = $word.ActiveDocument
112
+ $selection = $word.Selection
113
+
114
+ # Remember start position
115
+ $startPos = $selection.Range.Start
116
+
117
+ # Set all formatting BEFORE typing (including East Asian font for Korean)
118
+ ${fontSize ? `$selection.Font.Size = ${fontSize}` : ''}
119
+ $selection.Font.Bold = ${bold}
120
+ $selection.Font.Italic = ${italic}
121
+ ${fontName ? `$selection.Font.Name = '${fontName}'\n$selection.Font.NameFarEast = '${fontName}'` : ''}
122
+
123
+ # Type text (decoded from Base64 for Unicode safety)
124
+ ${typeCommands}
125
+
126
+ # Apply style, font, and paragraph formatting to the typed range
127
+ $endPos = $selection.Range.End
128
+ $typedRange = $doc.Range($startPos, $endPos)
129
+ ${postFormatCmds.join('\n')}
130
+ ${fontName ? `$typedRange.Font.Name = '${fontName}'\n$typedRange.Font.NameFarEast = '${fontName}'` : ''}
131
+
132
+ @{ success = $true; message = "Text written successfully" } | ConvertTo-Json -Compress
133
+ `);
134
+ }
135
+ async wordBuildCoverDesign(options) {
136
+ const escapedTitle = options.title.replace(/'/g, "''");
137
+ const escapedSubtitle = (options.subtitle || '').replace(/'/g, "''");
138
+ const escapedDate = (options.dateText || '').replace(/'/g, "''");
139
+ const escapedAuthor = (options.author || '').replace(/'/g, "''");
140
+ const hasKorean = /[가-힣ㄱ-ㅎㅏ-ㅣ]/.test(options.title + (options.subtitle || ''));
141
+ const titleFont = (options.fontTitle || (hasKorean ? 'Malgun Gothic' : 'Segoe UI')).replace(/'/g, "''");
142
+ const bodyFont = (options.fontBody || (hasKorean ? 'Malgun Gothic' : 'Segoe UI')).replace(/'/g, "''");
143
+ const primaryRgb = this.hexToRgb(options.primaryColor);
144
+ const accentRgb = this.hexToRgb(options.accentColor);
145
+ if (!primaryRgb || !accentRgb) {
146
+ return { success: false, error: 'Invalid color hex values' };
147
+ }
148
+ const primaryWd = primaryRgb.r + primaryRgb.g * 256 + primaryRgb.b * 65536;
149
+ const accentWd = accentRgb.r + accentRgb.g * 256 + accentRgb.b * 65536;
150
+ const hasSubtitle = escapedSubtitle.length > 0;
151
+ const hasInfo = escapedDate.length > 0 || escapedAuthor.length > 0;
152
+ const subtitleBlock = hasSubtitle ? `
153
+ $sY = $tY + 90
154
+ $st = $doc.Shapes.AddTextbox(1, 80, $sY, ($pgW - 160), 50, $anchor)
155
+ $st.LockAnchor = -1
156
+ $st.WrapFormat.Type = 3
157
+ $st.RelativeHorizontalPosition = 1
158
+ $st.RelativeVerticalPosition = 1
159
+ $st.Left = 80
160
+ $st.Top = $sY
161
+ $st.Width = $pgW - 160
162
+ $st.Height = 50
163
+ $st.TextFrame.TextRange.Text = '${escapedSubtitle}'
164
+ $st.TextFrame.TextRange.Font.Name = '${bodyFont}'
165
+ $st.TextFrame.TextRange.Font.Size = 14
166
+ $st.TextFrame.TextRange.Font.Color = 14540253
167
+ $st.TextFrame.TextRange.ParagraphFormat.Alignment = 1
168
+ $st.Fill.Visible = 0
169
+ $st.Line.Visible = 0` : '';
170
+ const infoLines = [];
171
+ if (escapedDate)
172
+ infoLines.push(`$infoText += '${escapedDate}'`);
173
+ if (escapedDate && escapedAuthor)
174
+ infoLines.push(`$infoText += [char]13`);
175
+ if (escapedAuthor)
176
+ infoLines.push(`$infoText += '${escapedAuthor}'`);
177
+ const infoBlock = hasInfo ? `
178
+ $iY = $bH + 30
179
+ $info = $doc.Shapes.AddTextbox(1, 80, $iY, ($pgW - 160), 55, $anchor)
180
+ $info.LockAnchor = -1
181
+ $info.WrapFormat.Type = 3
182
+ $info.RelativeHorizontalPosition = 1
183
+ $info.RelativeVerticalPosition = 1
184
+ $info.Left = 80
185
+ $info.Top = $iY
186
+ $info.Width = $pgW - 160
187
+ $info.Height = 55
188
+ $infoText = ''
189
+ ${infoLines.join('\n')}
190
+ $info.TextFrame.TextRange.Text = $infoText
191
+ $info.TextFrame.TextRange.Font.Name = '${bodyFont}'
192
+ $info.TextFrame.TextRange.Font.Size = 11
193
+ $info.TextFrame.TextRange.Font.Color = 8421504
194
+ $info.TextFrame.TextRange.ParagraphFormat.Alignment = 1
195
+ $info.Fill.Visible = 0
196
+ $info.Line.Visible = 0` : '';
197
+ return this.executePowerShell(`
198
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
199
+ $doc = $word.ActiveDocument
200
+ $word.Selection.HomeKey(6) # wdStory — ensure cursor at document start
201
+ $pgW = $doc.PageSetup.PageWidth
202
+ $pgH = $doc.PageSetup.PageHeight
203
+ $anchor = $doc.Range(0, 0) # anchor all shapes to first paragraph
204
+
205
+ # 1. Primary color banner (top 40%)
206
+ $bH = [math]::Round($pgH * 0.40)
207
+ $b = $doc.Shapes.AddShape(1, 0, 0, 10, 10, $anchor)
208
+ $b.LockAnchor = -1
209
+ $b.WrapFormat.Type = 3
210
+ $b.RelativeHorizontalPosition = 1
211
+ $b.RelativeVerticalPosition = 1
212
+ $b.Left = 0
213
+ $b.Top = 0
214
+ $b.Width = $pgW
215
+ $b.Height = $bH
216
+ $b.Fill.Visible = -1
217
+ $b.Fill.Solid()
218
+ $b.Fill.ForeColor.RGB = ${primaryWd}
219
+ $b.Line.Visible = 0
220
+
221
+ # 2. Accent strip below banner
222
+ $s = $doc.Shapes.AddShape(1, 0, 0, 10, 10, $anchor)
223
+ $s.LockAnchor = -1
224
+ $s.WrapFormat.Type = 3
225
+ $s.RelativeHorizontalPosition = 1
226
+ $s.RelativeVerticalPosition = 1
227
+ $s.Left = 0
228
+ $s.Top = $bH
229
+ $s.Width = $pgW
230
+ $s.Height = 5
231
+ $s.Fill.Visible = -1
232
+ $s.Fill.Solid()
233
+ $s.Fill.ForeColor.RGB = ${accentWd}
234
+ $s.Line.Visible = 0
235
+
236
+ # 3. Title textbox (white text on dark banner)
237
+ $tY = [math]::Round($bH * 0.32)
238
+ $t = $doc.Shapes.AddTextbox(1, 50, $tY, ($pgW - 100), 80, $anchor)
239
+ $t.LockAnchor = -1
240
+ $t.WrapFormat.Type = 3
241
+ $t.RelativeHorizontalPosition = 1
242
+ $t.RelativeVerticalPosition = 1
243
+ $t.Left = 50
244
+ $t.Top = $tY
245
+ $t.Width = $pgW - 100
246
+ $t.Height = 80
247
+ $t.TextFrame.TextRange.Text = '${escapedTitle}'
248
+ $t.TextFrame.TextRange.Font.Name = '${titleFont}'
249
+ $t.TextFrame.TextRange.Font.Size = 36
250
+ $t.TextFrame.TextRange.Font.Bold = -1
251
+ $t.TextFrame.TextRange.Font.Color = 16777215
252
+ $t.TextFrame.TextRange.ParagraphFormat.Alignment = 1
253
+ $t.TextFrame.MarginLeft = 10
254
+ $t.TextFrame.MarginRight = 10
255
+ $t.Fill.Visible = 0
256
+ $t.Line.Visible = 0
257
+ ${subtitleBlock}
258
+ ${infoBlock}
259
+
260
+ # 4. Bottom accent bar
261
+ $bb = $doc.Shapes.AddShape(1, 0, 0, 10, 10, $anchor)
262
+ $bb.LockAnchor = -1
263
+ $bb.WrapFormat.Type = 3
264
+ $bb.RelativeHorizontalPosition = 1
265
+ $bb.RelativeVerticalPosition = 1
266
+ $bb.Left = 0
267
+ $bb.Top = $pgH - 10
268
+ $bb.Width = $pgW
269
+ $bb.Height = 10
270
+ $bb.Fill.Visible = -1
271
+ $bb.Fill.Solid()
272
+ $bb.Fill.ForeColor.RGB = ${accentWd}
273
+ $bb.Line.Visible = 0
274
+
275
+ @{ success = $true; message = "Cover design created" } | ConvertTo-Json -Compress
276
+ `);
277
+ }
278
+ async wordRead() {
279
+ return this.executePowerShell(`
280
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
281
+ $doc = $word.ActiveDocument
282
+ $content = $doc.Content.Text
283
+ @{
284
+ success = $true
285
+ document_name = $doc.Name
286
+ content = $content
287
+ character_count = $content.Length
288
+ } | ConvertTo-Json -Compress
289
+ `);
290
+ }
291
+ async wordSave(filePath) {
292
+ const windowsPath = filePath ? this.toWindowsPath(filePath).replace(/'/g, "''") : '';
293
+ return this.executePowerShell(`
294
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
295
+ $doc = $word.ActiveDocument
296
+
297
+ # Update all Tables of Contents before saving
298
+ foreach ($toc in $doc.TablesOfContents) {
299
+ try { $toc.Update() } catch {}
300
+ }
301
+ foreach ($field in $doc.Fields) {
302
+ try { $field.Update() } catch {}
303
+ }
304
+
305
+ ${windowsPath ? `$doc.SaveAs([ref]'${windowsPath}')` : '$doc.Save()'}
306
+ @{ success = $true; message = "Document saved"; path = $doc.FullName } | ConvertTo-Json -Compress
307
+ `);
308
+ }
309
+ async wordOpen(filePath) {
310
+ const windowsPath = this.toWindowsPath(filePath).replace(/'/g, "''");
311
+ return this.executePowerShell(`
312
+ try {
313
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
314
+ } catch {
315
+ $word = New-Object -ComObject Word.Application
316
+ }
317
+ $word.DisplayAlerts = 0
318
+ $word.Visible = -1 # msoTrue
319
+ $doc = $word.Documents.Open('${windowsPath}')
320
+ $word.DisplayAlerts = -1
321
+ @{ success = $true; message = "Document opened"; document_name = $doc.Name; path = $doc.FullName } | ConvertTo-Json -Compress
322
+ `);
323
+ }
324
+ async wordClose(save = false) {
325
+ const saveOption = save ? '-1' : '0';
326
+ return this.executePowerShell(`
327
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
328
+ $word.ActiveDocument.Close(${saveOption})
329
+ @{ success = $true; message = "Document closed" } | ConvertTo-Json -Compress
330
+ `);
331
+ }
332
+ async wordQuit(save = false) {
333
+ const saveOption = save ? '-1' : '0';
334
+ return this.executePowerShell(`
335
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
336
+ $word.Quit(${saveOption})
337
+ @{ success = $true; message = "Word closed" } | ConvertTo-Json -Compress
338
+ `);
339
+ }
340
+ async wordSetFont(options) {
341
+ const commands = [];
342
+ if (options.fontName)
343
+ commands.push(`$selection.Font.Name = '${options.fontName.replace(/'/g, "''")}'`);
344
+ if (options.fontSize)
345
+ commands.push(`$selection.Font.Size = ${options.fontSize}`);
346
+ if (options.bold !== undefined)
347
+ commands.push(`$selection.Font.Bold = ${options.bold ? '$true' : '$false'}`);
348
+ if (options.italic !== undefined)
349
+ commands.push(`$selection.Font.Italic = ${options.italic ? '$true' : '$false'}`);
350
+ if (options.underline !== undefined)
351
+ commands.push(`$selection.Font.Underline = ${options.underline ? '1' : '0'}`);
352
+ if (options.color) {
353
+ const rgb = this.hexToRgb(options.color);
354
+ if (rgb)
355
+ commands.push(`$selection.Font.Color = ${rgb.r + rgb.g * 256 + rgb.b * 65536}`);
356
+ }
357
+ return this.executePowerShell(`
358
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
359
+ $selection = $word.Selection
360
+ ${commands.join('\n')}
361
+ @{ success = $true; message = "Font properties set" } | ConvertTo-Json -Compress
362
+ `);
363
+ }
364
+ async wordSetParagraph(options) {
365
+ const alignmentMap = { left: 0, center: 1, right: 2, justify: 3 };
366
+ const commands = [];
367
+ if (options.alignment)
368
+ commands.push(`$selection.ParagraphFormat.Alignment = ${alignmentMap[options.alignment]}`);
369
+ if (options.lineSpacing)
370
+ commands.push(`$selection.ParagraphFormat.LineSpacing = ${options.lineSpacing}`);
371
+ if (options.spaceBefore)
372
+ commands.push(`$selection.ParagraphFormat.SpaceBefore = ${options.spaceBefore}`);
373
+ if (options.spaceAfter)
374
+ commands.push(`$selection.ParagraphFormat.SpaceAfter = ${options.spaceAfter}`);
375
+ if (options.firstLineIndent)
376
+ commands.push(`$selection.ParagraphFormat.FirstLineIndent = ${options.firstLineIndent}`);
377
+ return this.executePowerShell(`
378
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
379
+ $selection = $word.Selection
380
+ ${commands.join('\n')}
381
+ @{ success = $true; message = "Paragraph formatting set" } | ConvertTo-Json -Compress
382
+ `);
383
+ }
384
+ async wordAddHyperlink(text, url) {
385
+ const escapedText = text.replace(/'/g, "''");
386
+ const escapedUrl = url.replace(/'/g, "''");
387
+ return this.executePowerShell(`
388
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
389
+ $selection = $word.Selection
390
+ $doc = $word.ActiveDocument
391
+ $range = $selection.Range
392
+ $doc.Hyperlinks.Add($range, '${escapedUrl}', '', '', '${escapedText}')
393
+ @{ success = $true; message = "Hyperlink added" } | ConvertTo-Json -Compress
394
+ `);
395
+ }
396
+ async wordAddTable(rows, cols, data) {
397
+ if (data) {
398
+ rows = Math.max(rows, data.length);
399
+ cols = Math.max(cols, ...data.map(row => row?.length || 0));
400
+ }
401
+ let dataScript = '';
402
+ if (data) {
403
+ const dataLines = [];
404
+ for (let i = 0; i < data.length && i < rows; i++) {
405
+ const row = data[i];
406
+ if (!row)
407
+ continue;
408
+ for (let j = 0; j < row.length && j < cols; j++) {
409
+ const cellValue = row[j];
410
+ if (cellValue === undefined)
411
+ continue;
412
+ const cellHasKorean = /[가-힣ㄱ-ㅎㅏ-ㅣ]/.test(cellValue);
413
+ const base64Val = this.encodeTextForPowerShell(cellValue);
414
+ const decodeExpr = `[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('${base64Val}'))`;
415
+ dataLines.push(`$table.Cell(${i + 1}, ${j + 1}).Range.Text = ${decodeExpr}`);
416
+ if (cellHasKorean) {
417
+ dataLines.push(`$table.Cell(${i + 1}, ${j + 1}).Range.Font.Name = 'Malgun Gothic'`);
418
+ }
419
+ }
420
+ }
421
+ dataScript = dataLines.join('\n');
422
+ }
423
+ return this.executePowerShell(`
424
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
425
+ $doc = $word.ActiveDocument
426
+ $range = $word.Selection.Range
427
+ $table = $doc.Tables.Add($range, ${rows}, ${cols})
428
+ $table.Borders.Enable = $true
429
+ # AutoFit to page width for clean layout
430
+ $table.AutoFitBehavior(2) # wdAutoFitWindow = 2
431
+ # Set consistent cell formatting for clean appearance
432
+ $table.Range.Font.Size = 10
433
+ $table.Range.ParagraphFormat.SpaceBefore = 2
434
+ $table.Range.ParagraphFormat.SpaceAfter = 2
435
+ $table.Range.ParagraphFormat.LineSpacingRule = 0 # wdLineSpaceSingle = 0
436
+ # Set cell vertical alignment to center
437
+ for ($r = 1; $r -le $table.Rows.Count; $r++) {
438
+ for ($c = 1; $c -le $table.Columns.Count; $c++) {
439
+ try { $table.Cell($r, $c).VerticalAlignment = 1 } catch {} # wdCellAlignVerticalCenter = 1
440
+ }
441
+ }
442
+ # Set cell margins for better padding
443
+ try {
444
+ $table.TopPadding = 4
445
+ $table.BottomPadding = 4
446
+ $table.LeftPadding = 6
447
+ $table.RightPadding = 6
448
+ } catch {}
449
+ ${dataScript}
450
+ # Move cursor after the table and add a new paragraph
451
+ $tableEnd = $table.Range
452
+ $tableEnd.Collapse(0) # wdCollapseEnd = 0
453
+ $tableEnd.Select()
454
+ $word.Selection.TypeParagraph()
455
+ @{ success = $true; message = "Table added with ${rows} rows and ${cols} columns" } | ConvertTo-Json -Compress
456
+ `);
457
+ }
458
+ async wordAddImage(imagePath, width, height) {
459
+ const windowsPath = this.toWindowsPath(imagePath).replace(/'/g, "''");
460
+ const sizeScript = width || height
461
+ ? `
462
+ ${width ? '$shape.Width = ' + width : ''}
463
+ ${height ? '$shape.Height = ' + height : ''}`
464
+ : '';
465
+ return this.executePowerShell(`
466
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
467
+ $selection = $word.Selection
468
+ $shape = $selection.InlineShapes.AddPicture('${windowsPath}')
469
+ ${sizeScript}
470
+ # Move cursor after the image
471
+ $selection.MoveRight(1, 1) # wdCharacter = 1
472
+ @{ success = $true; message = "Image added" } | ConvertTo-Json -Compress
473
+ `);
474
+ }
475
+ async wordDeleteText(start, end) {
476
+ return this.executePowerShell(`
477
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
478
+ $doc = $word.ActiveDocument
479
+ $range = $doc.Range(${start}, ${end})
480
+ $range.Delete()
481
+ @{ success = $true; message = "Text deleted from position ${start} to ${end}" } | ConvertTo-Json -Compress
482
+ `);
483
+ }
484
+ async wordFindReplace(find, replace, replaceAll = true) {
485
+ const escapedFind = find.replace(/'/g, "''");
486
+ const escapedReplace = replace.replace(/'/g, "''");
487
+ const replaceOption = replaceAll ? '2' : '1';
488
+ return this.executePowerShell(`
489
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
490
+ $doc = $word.ActiveDocument
491
+ $findObj = $doc.Content.Find
492
+ $findObj.ClearFormatting()
493
+ $findObj.Replacement.ClearFormatting()
494
+ $findObj.Text = '${escapedFind}'
495
+ $findObj.Replacement.Text = '${escapedReplace}'
496
+ $found = $findObj.Execute([ref]'${escapedFind}', [ref]$false, [ref]$false, [ref]$false, [ref]$false, [ref]$false, [ref]$true, [ref]0, [ref]$false, [ref]'${escapedReplace}', [ref]${replaceOption})
497
+ @{ success = $true; message = "Find and replace completed"; found = $found } | ConvertTo-Json -Compress
498
+ `);
499
+ }
500
+ async wordSetStyle(styleName, preserveKoreanFont = true) {
501
+ const styleIdMap = {
502
+ 'Normal': -1, 'Heading 1': -2, 'Heading 2': -3, 'Heading 3': -4,
503
+ 'Heading 4': -5, 'Heading 5': -6,
504
+ };
505
+ const styleId = styleIdMap[styleName];
506
+ const styleExpr = styleId !== undefined
507
+ ? `$doc.Styles.Item(${styleId})`
508
+ : `'${styleName.replace(/'/g, "''")}'`;
509
+ const fontPreserveScript = preserveKoreanFont ? `
510
+ # Check if selection contains Korean text and preserve font
511
+ $selectedText = $selection.Text
512
+ if ($selectedText -match '[가-힣ㄱ-ㅎㅏ-ㅣ]') {
513
+ $selection.Font.Name = 'Malgun Gothic'
514
+ }` : '';
515
+ return this.executePowerShell(`
516
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
517
+ $doc = $word.ActiveDocument
518
+ $selection = $word.Selection
519
+ $selection.Style = ${styleExpr}
520
+ ${fontPreserveScript}
521
+ @{ success = $true; message = "Style '${styleName}' applied" } | ConvertTo-Json -Compress
522
+ `);
523
+ }
524
+ async wordInsertBreak(breakType = 'page') {
525
+ const breakTypeMap = { page: 7, line: 6, section: 2 };
526
+ return this.executePowerShell(`
527
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
528
+ $selection = $word.Selection
529
+ $selection.InsertBreak(${breakTypeMap[breakType]})
530
+ @{ success = $true; message = "${breakType} break inserted" } | ConvertTo-Json -Compress
531
+ `);
532
+ }
533
+ async wordGetSelection() {
534
+ return this.executePowerShell(`
535
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
536
+ $selection = $word.Selection
537
+ @{
538
+ success = $true
539
+ text = $selection.Text
540
+ start = $selection.Start
541
+ end = $selection.End
542
+ font_name = $selection.Font.Name
543
+ font_size = $selection.Font.Size
544
+ } | ConvertTo-Json -Compress
545
+ `);
546
+ }
547
+ async wordSelectAll() {
548
+ return this.executePowerShell(`
549
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
550
+ $word.ActiveDocument.Content.Select()
551
+ @{ success = $true; message = "All content selected" } | ConvertTo-Json -Compress
552
+ `);
553
+ }
554
+ async wordGoto(what, target) {
555
+ const whatMap = { page: 1, line: 3, bookmark: -1 };
556
+ const isBookmark = what === 'bookmark';
557
+ return this.executePowerShell(`
558
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
559
+ $selection = $word.Selection
560
+ ${isBookmark
561
+ ? `$selection.GoTo(-1, 0, 0, '${String(target).replace(/'/g, "''")}')`
562
+ : `$selection.GoTo(${whatMap[what]}, 0, ${target})`}
563
+ @{ success = $true; message = "Moved to ${what} ${target}" } | ConvertTo-Json -Compress
564
+ `);
565
+ }
566
+ async wordInsertHeader(text, options) {
567
+ const hasKorean = /[가-힣ㄱ-ㅎㅏ-ㅣ]/.test(text);
568
+ const fontName = options?.fontName || (hasKorean ? 'Malgun Gothic' : '');
569
+ const processedText = text.replace(/\\n/g, '\n');
570
+ const base64Text = this.encodeTextForPowerShell(processedText);
571
+ const decodeExpr = `[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('${base64Text}'))`;
572
+ return this.executePowerShell(`
573
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
574
+ $doc = $word.ActiveDocument
575
+ $section = $doc.Sections(1)
576
+ $header = $section.Headers(1).Range
577
+ $header.Text = ${decodeExpr}
578
+ ${fontName ? `$header.Font.Name = '${fontName}'` : ''}
579
+ ${options?.fontSize ? `$header.Font.Size = ${options.fontSize}` : ''}
580
+ @{ success = $true; message = "Header added" } | ConvertTo-Json -Compress
581
+ `);
582
+ }
583
+ async wordInsertFooter(text, options) {
584
+ const hasKorean = /[가-힣ㄱ-ㅎㅏ-ㅣ]/.test(text);
585
+ const fontName = options?.fontName || (hasKorean ? 'Malgun Gothic' : '');
586
+ const processedText = text.replace(/\\n/g, '\n');
587
+ const base64Text = this.encodeTextForPowerShell(processedText);
588
+ const decodeExpr = `[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('${base64Text}'))`;
589
+ return this.executePowerShell(`
590
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
591
+ $doc = $word.ActiveDocument
592
+ $section = $doc.Sections(1)
593
+ $footer = $section.Footers(1).Range
594
+ $footer.Text = ${decodeExpr}
595
+ ${fontName ? `$footer.Font.Name = '${fontName}'` : ''}
596
+ ${options?.fontSize ? `$footer.Font.Size = ${options.fontSize}` : ''}
597
+ @{ success = $true; message = "Footer added" } | ConvertTo-Json -Compress
598
+ `);
599
+ }
600
+ async wordInsertPageNumber(alignment = 'center') {
601
+ const alignMap = { left: 0, center: 1, right: 2 };
602
+ return this.executePowerShell(`
603
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
604
+ $doc = $word.ActiveDocument
605
+ $section = $doc.Sections(1)
606
+ $footer = $section.Footers(1)
607
+ $footer.PageNumbers.Add(${alignMap[alignment]})
608
+ @{ success = $true; message = "Page numbers added" } | ConvertTo-Json -Compress
609
+ `);
610
+ }
611
+ async wordExportToPDF(outputPath) {
612
+ const windowsPath = this.toWindowsPath(outputPath).replace(/'/g, "''");
613
+ return this.executePowerShell(`
614
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
615
+ $doc = $word.ActiveDocument
616
+ $doc.ExportAsFixedFormat('${windowsPath}', 17) # 17 = wdExportFormatPDF
617
+ @{ success = $true; message = "Exported to PDF"; path = '${windowsPath}' } | ConvertTo-Json -Compress
618
+ `);
619
+ }
620
+ async wordPrint(copies = 1) {
621
+ return this.executePowerShell(`
622
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
623
+ $doc = $word.ActiveDocument
624
+ $doc.PrintOut([ref]$false, [ref]$false, [ref]0, [ref]"", [ref]"", [ref]"", [ref]0, [ref]${copies})
625
+ @{ success = $true; message = "Print job sent (${copies} copies)" } | ConvertTo-Json -Compress
626
+ `);
627
+ }
628
+ async wordScreenshot() {
629
+ const result = await this.executePowerShell(`
630
+ Add-Type -AssemblyName System.Windows.Forms
631
+ Add-Type -AssemblyName System.Drawing
632
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
633
+ $doc = $word.ActiveDocument
634
+
635
+ # Switch to Print Preview to get a good screenshot
636
+ $originalView = $word.ActiveWindow.View.Type
637
+ $word.ActiveWindow.View.Type = 3 # wdPrintView
638
+
639
+ try {
640
+ # Method 1: Try CopyAsPicture on content
641
+ $doc.Content.Select()
642
+ $word.Selection.CopyAsPicture()
643
+ Start-Sleep -Milliseconds 300
644
+
645
+ $img = [System.Windows.Forms.Clipboard]::GetImage()
646
+
647
+ if ($img -eq $null) {
648
+ # Method 2: Fallback - capture the Word window
649
+ $hwnd = $word.Application.Hwnd
650
+ if ($hwnd -gt 0) {
651
+ Add-Type @"
652
+ using System;
653
+ using System.Drawing;
654
+ using System.Runtime.InteropServices;
655
+ public class Screenshot {
656
+ [DllImport("user32.dll")]
657
+ public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
658
+ [DllImport("user32.dll")]
659
+ public static extern bool SetForegroundWindow(IntPtr hWnd);
660
+ public struct RECT { public int Left, Top, Right, Bottom; }
661
+ public static Bitmap CaptureWindow(IntPtr hwnd) {
662
+ RECT rect;
663
+ GetWindowRect(hwnd, out rect);
664
+ int width = rect.Right - rect.Left;
665
+ int height = rect.Bottom - rect.Top;
666
+ if (width <= 0 || height <= 0) return null;
667
+ Bitmap bmp = new Bitmap(width, height);
668
+ using (Graphics g = Graphics.FromImage(bmp)) {
669
+ g.CopyFromScreen(rect.Left, rect.Top, 0, 0, new Size(width, height));
670
+ }
671
+ return bmp;
672
+ }
673
+ }
674
+ "@
675
+ [Screenshot]::SetForegroundWindow([IntPtr]$hwnd)
676
+ Start-Sleep -Milliseconds 500
677
+ $img = [Screenshot]::CaptureWindow([IntPtr]$hwnd)
678
+ }
679
+ }
680
+
681
+ if ($img -eq $null) {
682
+ @{ success = $false; error = "Failed to capture screenshot" } | ConvertTo-Json -Compress
683
+ return
684
+ }
685
+
686
+ # Convert to base64
687
+ $ms = New-Object System.IO.MemoryStream
688
+ $img.Save($ms, [System.Drawing.Imaging.ImageFormat]::Png)
689
+ $bytes = $ms.ToArray()
690
+ $base64 = [Convert]::ToBase64String($bytes)
691
+ $ms.Dispose()
692
+ $img.Dispose()
693
+
694
+ # Deselect
695
+ $word.Selection.Collapse(1)
696
+
697
+ @{
698
+ success = $true
699
+ image = $base64
700
+ format = "png"
701
+ encoding = "base64"
702
+ } | ConvertTo-Json -Compress
703
+ } finally {
704
+ # Restore original view
705
+ $word.ActiveWindow.View.Type = $originalView
706
+ }
707
+ `);
708
+ return result;
709
+ }
710
+ async wordSetTableCell(tableIndex, row, col, text, options) {
711
+ const hasKorean = /[가-힣ㄱ-ㅎㅏ-ㅣ]/.test(text);
712
+ let fontName = options?.fontName?.replace(/'/g, "''") || '';
713
+ if (!fontName && hasKorean) {
714
+ fontName = 'Malgun Gothic';
715
+ }
716
+ const processedText = text.replace(/\\n/g, '\n');
717
+ const base64Text = this.encodeTextForPowerShell(processedText);
718
+ const decodeExpr = `[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('${base64Text}'))`;
719
+ return this.executePowerShell(`
720
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
721
+ $doc = $word.ActiveDocument
722
+ $table = $doc.Tables(${tableIndex})
723
+ $cell = $table.Cell(${row}, ${col})
724
+ $cell.Range.Text = ${decodeExpr}
725
+ ${fontName ? `$cell.Range.Font.Name = '${fontName}'` : ''}
726
+ ${options?.fontSize ? `$cell.Range.Font.Size = ${options.fontSize}` : ''}
727
+ ${options?.bold ? '$cell.Range.Font.Bold = -1' : ''}
728
+ @{ success = $true; message = "Table cell (${row},${col}) updated" } | ConvertTo-Json -Compress
729
+ `);
730
+ }
731
+ async wordMergeTableCells(tableIndex, startRow, startCol, endRow, endCol) {
732
+ return this.executePowerShell(`
733
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
734
+ $doc = $word.ActiveDocument
735
+ $table = $doc.Tables(${tableIndex})
736
+ $startCell = $table.Cell(${startRow}, ${startCol})
737
+ $endCell = $table.Cell(${endRow}, ${endCol})
738
+ $startCell.Merge($endCell)
739
+ @{ success = $true; message = "Table cells merged" } | ConvertTo-Json -Compress
740
+ `);
741
+ }
742
+ async wordSetTableStyle(tableIndex, styleName, preserveKoreanFont = true) {
743
+ const escapedStyle = styleName.replace(/'/g, "''");
744
+ const styleConstMap = {
745
+ 'table grid': -176,
746
+ 'table normal': -106,
747
+ '표 눈금': -176,
748
+ '표 보통': -106,
749
+ };
750
+ const lowerStyleName = styleName.toLowerCase();
751
+ const styleConst = styleConstMap[lowerStyleName];
752
+ const fontPreserveScript = preserveKoreanFont ? `
753
+ # Check if table contains Korean text and preserve font
754
+ $tableText = $table.Range.Text
755
+ if ($tableText -match '[가-힣ㄱ-ㅎㅏ-ㅣ]') {
756
+ $table.Range.Font.Name = 'Malgun Gothic'
757
+ }` : '';
758
+ return this.executePowerShell(`
759
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
760
+ $doc = $word.ActiveDocument
761
+ $table = $doc.Tables(${tableIndex})
762
+ try {
763
+ ${styleConst !== undefined
764
+ ? `$table.Style = ${styleConst}`
765
+ : `$table.Style = '${escapedStyle}'`}
766
+ ${fontPreserveScript}
767
+ @{ success = $true; message = "Table style set" } | ConvertTo-Json -Compress
768
+ } catch {
769
+ # Try with style name directly if constant fails
770
+ try {
771
+ $table.Style = '${escapedStyle}'
772
+ ${fontPreserveScript}
773
+ @{ success = $true; message = "Table style set to '${escapedStyle}'" } | ConvertTo-Json -Compress
774
+ } catch {
775
+ @{ success = $false; error = "Style '${escapedStyle}' not found. Try: 'Table Grid', 'Table Normal', or numeric style index." } | ConvertTo-Json -Compress
776
+ }
777
+ }
778
+ `);
779
+ }
780
+ async wordStyleTableHeaderRow(tableIndex, bgColor, textColor = '#FFFFFF') {
781
+ const bgRgb = this.hexToRgb(bgColor);
782
+ const textRgb = this.hexToRgb(textColor);
783
+ if (!bgRgb || !textRgb) {
784
+ return { success: false, error: 'Invalid color hex value' };
785
+ }
786
+ const bgWd = bgRgb.r + bgRgb.g * 256 + bgRgb.b * 65536;
787
+ const textWd = textRgb.r + textRgb.g * 256 + textRgb.b * 65536;
788
+ const lightR = Math.round(bgRgb.r * 0.08 + 255 * 0.92);
789
+ const lightG = Math.round(bgRgb.g * 0.08 + 255 * 0.92);
790
+ const lightB = Math.round(bgRgb.b * 0.08 + 255 * 0.92);
791
+ const lightWd = lightR + lightG * 256 + lightB * 65536;
792
+ return this.executePowerShell(`
793
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
794
+ $doc = $word.ActiveDocument
795
+ $table = $doc.Tables(${tableIndex})
796
+ $headerRow = $table.Rows(1)
797
+ $headerRow.Shading.BackgroundPatternColor = ${bgWd}
798
+ $headerRow.Range.Font.Color = ${textWd}
799
+ $headerRow.Range.Font.Bold = -1
800
+ $headerRow.Range.Font.Size = 11
801
+ $headerRow.Range.ParagraphFormat.Alignment = 1 # wdAlignParagraphCenter
802
+ $headerRow.Range.ParagraphFormat.SpaceBefore = 3
803
+ $headerRow.Range.ParagraphFormat.SpaceAfter = 3
804
+ for ($i = 3; $i -le $table.Rows.Count; $i += 2) {
805
+ try { $table.Rows($i).Shading.BackgroundPatternColor = ${lightWd} } catch {}
806
+ }
807
+ $tableText = $table.Range.Text
808
+ if ($tableText -match '[가-힣ㄱ-ㅎㅏ-ㅣ]') {
809
+ $table.Range.Font.Name = 'Malgun Gothic'
810
+ $headerRow.Range.Font.Name = 'Malgun Gothic'
811
+ }
812
+ @{ success = $true; message = "Table header row styled" } | ConvertTo-Json -Compress
813
+ `);
814
+ }
815
+ async wordSetTableBorder(tableIndex, options) {
816
+ const styleMap = {
817
+ single: 1,
818
+ double: 7,
819
+ thick: 14,
820
+ none: 0,
821
+ };
822
+ const lineStyle = styleMap[options.style || 'single'] ?? 1;
823
+ const colorValue = options.color ? (() => {
824
+ const rgb = this.hexToRgb(options.color);
825
+ return rgb ? rgb.r + rgb.g * 256 + rgb.b * 65536 : 0;
826
+ })() : 0;
827
+ return this.executePowerShell(`
828
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
829
+ $doc = $word.ActiveDocument
830
+ $table = $doc.Tables(${tableIndex})
831
+
832
+ # Border indices: wdBorderTop=-1, wdBorderLeft=-2, wdBorderBottom=-3, wdBorderRight=-4
833
+ # wdBorderHorizontal=-5, wdBorderVertical=-6
834
+ $borderIndices = @(-1, -2, -3, -4)
835
+ foreach ($idx in $borderIndices) {
836
+ $table.Borders.Item($idx).LineStyle = ${lineStyle}
837
+ ${colorValue ? `$table.Borders.Item($idx).Color = ${colorValue}` : ''}
838
+ }
839
+
840
+ # Inside borders (may not exist for 1-row or 1-column tables)
841
+ try {
842
+ $table.Borders.Item(-5).LineStyle = ${lineStyle} # Horizontal inside
843
+ ${colorValue ? `$table.Borders.Item(-5).Color = ${colorValue}` : ''}
844
+ } catch {}
845
+ try {
846
+ $table.Borders.Item(-6).LineStyle = ${lineStyle} # Vertical inside
847
+ ${colorValue ? `$table.Borders.Item(-6).Color = ${colorValue}` : ''}
848
+ } catch {}
849
+
850
+ @{ success = $true; message = "Table border set" } | ConvertTo-Json -Compress
851
+ `);
852
+ }
853
+ async wordAddBookmark(name, text) {
854
+ const escapedName = name.replace(/'/g, "''");
855
+ const escapedText = text ? text.replace(/'/g, "''") : '';
856
+ const originalTextLength = text ? text.length : 0;
857
+ const hasKorean = text ? /[가-힣ㄱ-ㅎㅏ-ㅣ]/.test(text) : false;
858
+ return this.executePowerShell(`
859
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
860
+ $doc = $word.ActiveDocument
861
+ $selection = $word.Selection
862
+ ${text ? `${hasKorean ? "$selection.Font.Name = 'Malgun Gothic'" : ''}
863
+ $selection.TypeText('${escapedText}')
864
+ $selection.MoveLeft(1, ${originalTextLength}, 1)` : ''}
865
+ $doc.Bookmarks.Add('${escapedName}', $selection.Range)
866
+ @{ success = $true; message = "Bookmark '${escapedName}' added" } | ConvertTo-Json -Compress
867
+ `);
868
+ }
869
+ async wordGetBookmarks() {
870
+ return this.executePowerShell(`
871
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
872
+ $doc = $word.ActiveDocument
873
+ $bookmarks = @()
874
+ foreach ($bm in $doc.Bookmarks) {
875
+ $bookmarks += @{
876
+ name = $bm.Name
877
+ start = $bm.Range.Start
878
+ end = $bm.Range.End
879
+ text = $bm.Range.Text
880
+ }
881
+ }
882
+ @{ success = $true; bookmarks = $bookmarks } | ConvertTo-Json -Compress -Depth 5
883
+ `);
884
+ }
885
+ async wordDeleteBookmark(name) {
886
+ const escapedName = name.replace(/'/g, "''");
887
+ return this.executePowerShell(`
888
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
889
+ $doc = $word.ActiveDocument
890
+ if ($doc.Bookmarks.Exists('${escapedName}')) {
891
+ $doc.Bookmarks('${escapedName}').Delete()
892
+ @{ success = $true; message = "Bookmark '${escapedName}' deleted" } | ConvertTo-Json -Compress
893
+ } else {
894
+ @{ success = $false; error = "Bookmark '${escapedName}' not found" } | ConvertTo-Json -Compress
895
+ }
896
+ `);
897
+ }
898
+ async wordGotoBookmark(name) {
899
+ const escapedName = name.replace(/'/g, "''");
900
+ return this.executePowerShell(`
901
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
902
+ $doc = $word.ActiveDocument
903
+ if ($doc.Bookmarks.Exists('${escapedName}')) {
904
+ $doc.Bookmarks('${escapedName}').Select()
905
+ @{ success = $true; message = "Moved to bookmark '${escapedName}'" } | ConvertTo-Json -Compress
906
+ } else {
907
+ @{ success = $false; error = "Bookmark '${escapedName}' not found" } | ConvertTo-Json -Compress
908
+ }
909
+ `);
910
+ }
911
+ async wordAddComment(commentText, author) {
912
+ const escapedText = commentText.replace(/'/g, "''");
913
+ const escapedAuthor = author?.replace(/'/g, "''") || '';
914
+ return this.executePowerShell(`
915
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
916
+ $doc = $word.ActiveDocument
917
+ $selection = $word.Selection
918
+ $comment = $doc.Comments.Add($selection.Range, '${escapedText}')
919
+ ${escapedAuthor ? `$comment.Author = '${escapedAuthor}'` : ''}
920
+ @{ success = $true; message = "Comment added" } | ConvertTo-Json -Compress
921
+ `);
922
+ }
923
+ async wordGetComments() {
924
+ return this.executePowerShell(`
925
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
926
+ $doc = $word.ActiveDocument
927
+ $comments = @()
928
+ foreach ($c in $doc.Comments) {
929
+ $comments += @{
930
+ index = $c.Index
931
+ author = $c.Author
932
+ text = $c.Range.Text
933
+ date = $c.Date.ToString("yyyy-MM-dd HH:mm:ss")
934
+ scope = $c.Scope.Text
935
+ }
936
+ }
937
+ @{ success = $true; comments = $comments; count = $doc.Comments.Count } | ConvertTo-Json -Compress -Depth 5
938
+ `);
939
+ }
940
+ async wordDeleteComment(index) {
941
+ return this.executePowerShell(`
942
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
943
+ $doc = $word.ActiveDocument
944
+ if (${index} -le $doc.Comments.Count) {
945
+ $doc.Comments(${index}).Delete()
946
+ @{ success = $true; message = "Comment ${index} deleted" } | ConvertTo-Json -Compress
947
+ } else {
948
+ @{ success = $false; error = "Comment index ${index} out of range" } | ConvertTo-Json -Compress
949
+ }
950
+ `);
951
+ }
952
+ async wordDeleteAllComments() {
953
+ return this.executePowerShell(`
954
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
955
+ $doc = $word.ActiveDocument
956
+ $count = $doc.Comments.Count
957
+ while ($doc.Comments.Count -gt 0) {
958
+ $doc.Comments(1).Delete()
959
+ }
960
+ @{ success = $true; message = "Deleted $count comments" } | ConvertTo-Json -Compress
961
+ `);
962
+ }
963
+ async wordCreateBulletList(items) {
964
+ const itemsScript = items.map(item => {
965
+ const hasKorean = /[가-힣ㄱ-ㅎㅏ-ㅣ]/.test(item);
966
+ const base64Item = this.encodeTextForPowerShell(item);
967
+ const decodeExpr = `[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('${base64Item}'))`;
968
+ return `$selection.TypeText(${decodeExpr})
969
+ ${hasKorean ? "$selection.Font.Name = 'Malgun Gothic'" : ''}
970
+ $selection.TypeParagraph()`;
971
+ }).join('\n');
972
+ return this.executePowerShell(`
973
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
974
+ $selection = $word.Selection
975
+ $selection.Font.Size = 11
976
+ $selection.Font.Name = 'Malgun Gothic'
977
+ $selection.Range.ListFormat.ApplyBulletDefault()
978
+ ${itemsScript}
979
+ $selection.Range.ListFormat.RemoveNumbers()
980
+ @{ success = $true; message = "Bullet list created with ${items.length} items" } | ConvertTo-Json -Compress
981
+ `);
982
+ }
983
+ async wordCreateNumberedList(items) {
984
+ const itemsScript = items.map(item => {
985
+ const hasKorean = /[가-힣ㄱ-ㅎㅏ-ㅣ]/.test(item);
986
+ const base64Item = this.encodeTextForPowerShell(item);
987
+ const decodeExpr = `[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('${base64Item}'))`;
988
+ return `$selection.TypeText(${decodeExpr})
989
+ ${hasKorean ? "$selection.Font.Name = 'Malgun Gothic'" : ''}
990
+ $selection.TypeParagraph()`;
991
+ }).join('\n');
992
+ return this.executePowerShell(`
993
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
994
+ $selection = $word.Selection
995
+ $selection.Font.Size = 11
996
+ $selection.Font.Name = 'Malgun Gothic'
997
+ $selection.Range.ListFormat.ApplyNumberDefault()
998
+ ${itemsScript}
999
+ $selection.Range.ListFormat.RemoveNumbers()
1000
+ @{ success = $true; message = "Numbered list created with ${items.length} items" } | ConvertTo-Json -Compress
1001
+ `);
1002
+ }
1003
+ async wordSetPageMargins(options) {
1004
+ const cmToPoints = (cm) => Math.round(cm * 28.3465 * 100) / 100;
1005
+ const commands = [];
1006
+ if (options.top !== undefined)
1007
+ commands.push(`$pageSetup.TopMargin = ${cmToPoints(options.top)}`);
1008
+ if (options.bottom !== undefined)
1009
+ commands.push(`$pageSetup.BottomMargin = ${cmToPoints(options.bottom)}`);
1010
+ if (options.left !== undefined)
1011
+ commands.push(`$pageSetup.LeftMargin = ${cmToPoints(options.left)}`);
1012
+ if (options.right !== undefined)
1013
+ commands.push(`$pageSetup.RightMargin = ${cmToPoints(options.right)}`);
1014
+ return this.executePowerShell(`
1015
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1016
+ $doc = $word.ActiveDocument
1017
+ $pageSetup = $doc.PageSetup
1018
+ ${commands.join('\n')}
1019
+ @{ success = $true; message = "Page margins updated" } | ConvertTo-Json -Compress
1020
+ `);
1021
+ }
1022
+ async wordSetPageOrientation(orientation) {
1023
+ const value = orientation === 'landscape' ? 1 : 0;
1024
+ return this.executePowerShell(`
1025
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1026
+ $doc = $word.ActiveDocument
1027
+ $doc.PageSetup.Orientation = ${value}
1028
+ @{ success = $true; message = "Page orientation set to ${orientation}" } | ConvertTo-Json -Compress
1029
+ `);
1030
+ }
1031
+ async wordSetPageSize(size, width, height) {
1032
+ const sizeMap = {
1033
+ A4: 7,
1034
+ Letter: 2,
1035
+ Legal: 4,
1036
+ A3: 6,
1037
+ B5: 13,
1038
+ };
1039
+ if (size === 'custom' && width && height) {
1040
+ return this.executePowerShell(`
1041
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1042
+ $doc = $word.ActiveDocument
1043
+ $doc.PageSetup.PageWidth = ${width}
1044
+ $doc.PageSetup.PageHeight = ${height}
1045
+ @{ success = $true; message = "Page size set to custom (${width}x${height})" } | ConvertTo-Json -Compress
1046
+ `);
1047
+ }
1048
+ const paperSize = sizeMap[size] ?? 7;
1049
+ return this.executePowerShell(`
1050
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1051
+ $doc = $word.ActiveDocument
1052
+ $doc.PageSetup.PaperSize = ${paperSize}
1053
+ @{ success = $true; message = "Page size set to ${size}" } | ConvertTo-Json -Compress
1054
+ `);
1055
+ }
1056
+ async wordAddWatermark(text, options) {
1057
+ const escapedText = text.replace(/'/g, "''");
1058
+ const fontName = options?.fontName?.replace(/'/g, "''") || 'Arial';
1059
+ const fontSize = options?.fontSize || 72;
1060
+ const colorValue = options?.color ? (() => {
1061
+ const rgb = this.hexToRgb(options.color);
1062
+ return rgb ? rgb.r + rgb.g * 256 + rgb.b * 65536 : 12632256;
1063
+ })() : 12632256;
1064
+ const semitransparent = options?.semitransparent !== false ? '0.5' : '0';
1065
+ return this.executePowerShell(`
1066
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1067
+ $doc = $word.ActiveDocument
1068
+
1069
+ # Store original view and switch to Print Layout to access headers
1070
+ $originalView = $word.ActiveWindow.View.Type
1071
+ $word.ActiveWindow.View.Type = 3 # wdPrintView
1072
+
1073
+ try {
1074
+ # Add watermark to header
1075
+ $section = $doc.Sections(1)
1076
+ $header = $section.Headers(1) # wdHeaderFooterPrimary = 1
1077
+
1078
+ # Create text effect shape (without Select to avoid view access issues)
1079
+ $shape = $header.Shapes.AddTextEffect(0, '${escapedText}', '${fontName}', ${fontSize}, 0, 0, 0, 0)
1080
+ $shape.Name = "PowerPlusWaterMarkObject"
1081
+ $shape.TextEffect.NormalizedHeight = 0
1082
+ $shape.Line.Visible = 0
1083
+ $shape.Fill.Visible = -1
1084
+ $shape.Fill.Solid()
1085
+ $shape.Fill.ForeColor.RGB = ${colorValue}
1086
+ $shape.Fill.Transparency = ${semitransparent}
1087
+ $shape.Rotation = 315
1088
+ $shape.LockAspectRatio = -1
1089
+ $shape.Height = 100
1090
+ $shape.Width = 350
1091
+ $shape.Left = -999995 # wdShapeCenter
1092
+ $shape.Top = -999995 # wdShapeCenter
1093
+ $shape.WrapFormat.AllowOverlap = -1
1094
+ $shape.WrapFormat.Type = 3 # wdWrapBehind
1095
+
1096
+ @{ success = $true; message = "Watermark added" } | ConvertTo-Json -Compress
1097
+ } finally {
1098
+ # Restore original view
1099
+ $word.ActiveWindow.View.Type = $originalView
1100
+ }
1101
+ `);
1102
+ }
1103
+ async wordRemoveWatermark() {
1104
+ return this.executePowerShell(`
1105
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1106
+ $doc = $word.ActiveDocument
1107
+
1108
+ # Switch to Print Layout view to access headers (wdPrintView = 3)
1109
+ $word.ActiveWindow.View.Type = 3
1110
+
1111
+ foreach ($section in $doc.Sections) {
1112
+ $header = $section.Headers(1)
1113
+ foreach ($shape in $header.Shapes) {
1114
+ if ($shape.Name -like "*WaterMark*") {
1115
+ $shape.Delete()
1116
+ }
1117
+ }
1118
+ }
1119
+ @{ success = $true; message = "Watermark removed" } | ConvertTo-Json -Compress
1120
+ `);
1121
+ }
1122
+ async wordAddTextbox(text, left, top, width, height, options) {
1123
+ const hasKorean = /[가-힣ㄱ-ㅎㅏ-ㅣ]/.test(text);
1124
+ let fontName = options?.fontName?.replace(/'/g, "''") || '';
1125
+ if (!fontName && hasKorean) {
1126
+ fontName = 'Malgun Gothic';
1127
+ }
1128
+ const processedText = text.replace(/\\n/g, '\n');
1129
+ const base64Text = this.encodeTextForPowerShell(processedText);
1130
+ const decodeExpr = `[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('${base64Text}'))`;
1131
+ const commands = [];
1132
+ if (fontName)
1133
+ commands.push(`$shape.TextFrame.TextRange.Font.Name = '${fontName}'`);
1134
+ if (options?.fontSize)
1135
+ commands.push(`$shape.TextFrame.TextRange.Font.Size = ${options.fontSize}`);
1136
+ if (options?.borderColor) {
1137
+ const rgb = this.hexToRgb(options.borderColor);
1138
+ if (rgb) {
1139
+ commands.push('$shape.Line.Visible = -1');
1140
+ commands.push(`$shape.Line.ForeColor.RGB = ${rgb.r + rgb.g * 256 + rgb.b * 65536}`);
1141
+ }
1142
+ }
1143
+ if (options?.fillColor) {
1144
+ const rgb = this.hexToRgb(options.fillColor);
1145
+ if (rgb) {
1146
+ commands.push('$shape.Fill.Visible = -1');
1147
+ commands.push(`$shape.Fill.ForeColor.RGB = ${rgb.r + rgb.g * 256 + rgb.b * 65536}`);
1148
+ }
1149
+ }
1150
+ else {
1151
+ commands.push('$shape.Fill.Visible = 0');
1152
+ }
1153
+ return this.executePowerShell(`
1154
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1155
+ $doc = $word.ActiveDocument
1156
+ $shape = $doc.Shapes.AddTextbox(1, ${left}, ${top}, ${width}, ${height})
1157
+ ${fontName ? `$shape.TextFrame.TextRange.Font.Name = '${fontName}'` : ''}
1158
+ $shape.TextFrame.TextRange.Text = ${decodeExpr}
1159
+ ${commands.filter(c => !c.includes('Font.Name')).join('\n')}
1160
+ @{ success = $true; message = "Textbox added"; shape_name = $shape.Name } | ConvertTo-Json -Compress
1161
+ `);
1162
+ }
1163
+ async wordAddShape(shapeType, left, top, width, height, options) {
1164
+ if (shapeType === 'line') {
1165
+ return this.wordAddLine(left, top, left + width, top + height, options);
1166
+ }
1167
+ const shapeMap = {
1168
+ rectangle: 1,
1169
+ oval: 9,
1170
+ roundedRectangle: 5,
1171
+ triangle: 7,
1172
+ diamond: 4,
1173
+ arrow: 33,
1174
+ };
1175
+ const shapeTypeValue = shapeMap[shapeType] ?? 1;
1176
+ const commands = [];
1177
+ if (options?.fillColor) {
1178
+ const rgb = this.hexToRgb(options.fillColor);
1179
+ if (rgb) {
1180
+ commands.push('$shape.Fill.Visible = -1');
1181
+ commands.push('$shape.Fill.Solid()');
1182
+ commands.push(`$shape.Fill.ForeColor.RGB = ${rgb.r + rgb.g * 256 + rgb.b * 65536}`);
1183
+ }
1184
+ }
1185
+ if (options?.lineColor) {
1186
+ const rgb = this.hexToRgb(options.lineColor);
1187
+ if (rgb) {
1188
+ commands.push('$shape.Line.Visible = -1');
1189
+ commands.push(`$shape.Line.ForeColor.RGB = ${rgb.r + rgb.g * 256 + rgb.b * 65536}`);
1190
+ }
1191
+ }
1192
+ if (options?.lineWeight) {
1193
+ commands.push(`$shape.Line.Weight = ${options.lineWeight}`);
1194
+ }
1195
+ return this.executePowerShell(`
1196
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1197
+ $doc = $word.ActiveDocument
1198
+ $shape = $doc.Shapes.AddShape(${shapeTypeValue}, ${left}, ${top}, ${width}, ${height})
1199
+ ${commands.join('\n')}
1200
+ @{ success = $true; message = "Shape added"; shape_name = $shape.Name } | ConvertTo-Json -Compress
1201
+ `);
1202
+ }
1203
+ async wordAddLine(startX, startY, endX, endY, options) {
1204
+ const commands = [];
1205
+ if (options?.lineColor) {
1206
+ const rgb = this.hexToRgb(options.lineColor);
1207
+ if (rgb) {
1208
+ commands.push('$shape.Line.Visible = -1');
1209
+ commands.push(`$shape.Line.ForeColor.RGB = ${rgb.r + rgb.g * 256 + rgb.b * 65536}`);
1210
+ }
1211
+ }
1212
+ if (options?.lineWeight) {
1213
+ commands.push(`$shape.Line.Weight = ${options.lineWeight}`);
1214
+ }
1215
+ return this.executePowerShell(`
1216
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1217
+ $doc = $word.ActiveDocument
1218
+ $shape = $doc.Shapes.AddLine(${startX}, ${startY}, ${endX}, ${endY})
1219
+ ${commands.join('\n')}
1220
+ @{ success = $true; message = "Line added"; shape_name = $shape.Name } | ConvertTo-Json -Compress
1221
+ `);
1222
+ }
1223
+ async wordGetDocumentInfo() {
1224
+ return this.executePowerShell(`
1225
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1226
+ $doc = $word.ActiveDocument
1227
+ $stats = $doc.ComputeStatistics(0) # wdStatisticWords
1228
+
1229
+ @{
1230
+ success = $true
1231
+ name = $doc.Name
1232
+ path = $doc.FullName
1233
+ pages = $doc.ComputeStatistics(2) # wdStatisticPages
1234
+ words = $doc.ComputeStatistics(0) # wdStatisticWords
1235
+ characters = $doc.ComputeStatistics(3) # wdStatisticCharacters
1236
+ characters_with_spaces = $doc.ComputeStatistics(5) # wdStatisticCharactersWithSpaces
1237
+ paragraphs = $doc.ComputeStatistics(4) # wdStatisticParagraphs
1238
+ lines = $doc.ComputeStatistics(1) # wdStatisticLines
1239
+ saved = $doc.Saved
1240
+ read_only = $doc.ReadOnly
1241
+ } | ConvertTo-Json -Compress
1242
+ `);
1243
+ }
1244
+ async wordSetColumns(count, spacing) {
1245
+ const spacingScript = spacing !== undefined ? `$pageSetup.TextColumns.Spacing = ${spacing}` : '';
1246
+ return this.executePowerShell(`
1247
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1248
+ $doc = $word.ActiveDocument
1249
+ $pageSetup = $doc.PageSetup
1250
+ $pageSetup.TextColumns.SetCount(${count})
1251
+ ${spacingScript}
1252
+ @{ success = $true; message = "Columns set to ${count}${spacing !== undefined ? ` with spacing ${spacing}pt` : ''}" } | ConvertTo-Json -Compress
1253
+ `);
1254
+ }
1255
+ async wordUndo(times = 1) {
1256
+ return this.executePowerShell(`
1257
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1258
+ $doc = $word.ActiveDocument
1259
+ for ($i = 0; $i -lt ${times}; $i++) {
1260
+ $doc.Undo()
1261
+ }
1262
+ @{ success = $true; message = "Undo performed ${times} time(s)" } | ConvertTo-Json -Compress
1263
+ `);
1264
+ }
1265
+ async wordRedo(times = 1) {
1266
+ return this.executePowerShell(`
1267
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1268
+ $doc = $word.ActiveDocument
1269
+ for ($i = 0; $i -lt ${times}; $i++) {
1270
+ $doc.Redo()
1271
+ }
1272
+ @{ success = $true; message = "Redo performed ${times} time(s)" } | ConvertTo-Json -Compress
1273
+ `);
1274
+ }
1275
+ async wordGetSelectedText() {
1276
+ return this.executePowerShell(`
1277
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1278
+ $selection = $word.Selection
1279
+ @{
1280
+ success = $true
1281
+ text = $selection.Text
1282
+ start = $selection.Start
1283
+ end = $selection.End
1284
+ type = $selection.Type # 0=none, 1=normal, 2=IP (insertion point)
1285
+ } | ConvertTo-Json -Compress
1286
+ `);
1287
+ }
1288
+ async wordSelectRange(start, end) {
1289
+ return this.executePowerShell(`
1290
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1291
+ $doc = $word.ActiveDocument
1292
+ $range = $doc.Range(${start}, ${end})
1293
+ $range.Select()
1294
+ @{ success = $true; message = "Selected range from ${start} to ${end}"; text = $range.Text } | ConvertTo-Json -Compress
1295
+ `);
1296
+ }
1297
+ async wordMoveCursor(unit, count, extend = false) {
1298
+ const unitMap = { character: 1, word: 2, line: 5, paragraph: 4 };
1299
+ const unitValue = unitMap[unit] ?? 1;
1300
+ const direction = count >= 0 ? 'MoveRight' : 'MoveLeft';
1301
+ const absCount = Math.abs(count);
1302
+ const extendMode = extend ? '1' : '0';
1303
+ return this.executePowerShell(`
1304
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1305
+ $selection = $word.Selection
1306
+ $selection.${direction}(${unitValue}, ${absCount}, ${extendMode})
1307
+ @{
1308
+ success = $true
1309
+ message = "Cursor moved ${count} ${unit}(s)"
1310
+ position = $selection.Start
1311
+ end_position = $selection.End
1312
+ } | ConvertTo-Json -Compress
1313
+ `);
1314
+ }
1315
+ async wordMoveCursorTo(position) {
1316
+ const method = position === 'start' ? 'HomeKey' : 'EndKey';
1317
+ return this.executePowerShell(`
1318
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1319
+ $selection = $word.Selection
1320
+ $selection.${method}(6) # wdStory = 6
1321
+ @{ success = $true; message = "Cursor moved to ${position} of document"; position = $selection.Start } | ConvertTo-Json -Compress
1322
+ `);
1323
+ }
1324
+ async wordAddTableRow(tableIndex, position) {
1325
+ const positionScript = position !== undefined
1326
+ ? `$row = $table.Rows(${position})\n$table.Rows.Add($row)`
1327
+ : '$table.Rows.Add()';
1328
+ return this.executePowerShell(`
1329
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1330
+ $doc = $word.ActiveDocument
1331
+ $table = $doc.Tables(${tableIndex})
1332
+ ${positionScript}
1333
+ @{ success = $true; message = "Row added to table ${tableIndex}"; total_rows = $table.Rows.Count } | ConvertTo-Json -Compress
1334
+ `);
1335
+ }
1336
+ async wordAddTableColumn(tableIndex, position) {
1337
+ const positionScript = position !== undefined
1338
+ ? `$col = $table.Columns(${position})\n$table.Columns.Add($col)`
1339
+ : '$table.Columns.Add()';
1340
+ return this.executePowerShell(`
1341
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1342
+ $doc = $word.ActiveDocument
1343
+ $table = $doc.Tables(${tableIndex})
1344
+ ${positionScript}
1345
+ @{ success = $true; message = "Column added to table ${tableIndex}"; total_columns = $table.Columns.Count } | ConvertTo-Json -Compress
1346
+ `);
1347
+ }
1348
+ async wordDeleteTableRow(tableIndex, rowIndex) {
1349
+ return this.executePowerShell(`
1350
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1351
+ $doc = $word.ActiveDocument
1352
+ $table = $doc.Tables(${tableIndex})
1353
+ if (${rowIndex} -le $table.Rows.Count) {
1354
+ $table.Rows(${rowIndex}).Delete()
1355
+ @{ success = $true; message = "Row ${rowIndex} deleted from table ${tableIndex}"; remaining_rows = $table.Rows.Count } | ConvertTo-Json -Compress
1356
+ } else {
1357
+ @{ success = $false; error = "Row index ${rowIndex} out of range (table has $($table.Rows.Count) rows)" } | ConvertTo-Json -Compress
1358
+ }
1359
+ `);
1360
+ }
1361
+ async wordDeleteTableColumn(tableIndex, colIndex) {
1362
+ return this.executePowerShell(`
1363
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1364
+ $doc = $word.ActiveDocument
1365
+ $table = $doc.Tables(${tableIndex})
1366
+ if (${colIndex} -le $table.Columns.Count) {
1367
+ $table.Columns(${colIndex}).Delete()
1368
+ @{ success = $true; message = "Column ${colIndex} deleted from table ${tableIndex}"; remaining_columns = $table.Columns.Count } | ConvertTo-Json -Compress
1369
+ } else {
1370
+ @{ success = $false; error = "Column index ${colIndex} out of range (table has $($table.Columns.Count) columns)" } | ConvertTo-Json -Compress
1371
+ }
1372
+ `);
1373
+ }
1374
+ async wordGetTableInfo(tableIndex) {
1375
+ return this.executePowerShell(`
1376
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1377
+ $doc = $word.ActiveDocument
1378
+ if (${tableIndex} -le $doc.Tables.Count) {
1379
+ $table = $doc.Tables(${tableIndex})
1380
+ @{
1381
+ success = $true
1382
+ table_index = ${tableIndex}
1383
+ rows = $table.Rows.Count
1384
+ columns = $table.Columns.Count
1385
+ style = $table.Style
1386
+ } | ConvertTo-Json -Compress
1387
+ } else {
1388
+ @{ success = $false; error = "Table index ${tableIndex} out of range (document has $($doc.Tables.Count) tables)" } | ConvertTo-Json -Compress
1389
+ }
1390
+ `);
1391
+ }
1392
+ async wordSetTrackChanges(enabled) {
1393
+ return this.executePowerShell(`
1394
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1395
+ $doc = $word.ActiveDocument
1396
+ $doc.TrackRevisions = ${enabled ? '$true' : '$false'}
1397
+ @{ success = $true; message = "Track changes ${enabled ? 'enabled' : 'disabled'}"; track_revisions = $doc.TrackRevisions } | ConvertTo-Json -Compress
1398
+ `);
1399
+ }
1400
+ async wordGetTrackChanges() {
1401
+ return this.executePowerShell(`
1402
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1403
+ $doc = $word.ActiveDocument
1404
+ $revisions = @()
1405
+ foreach ($rev in $doc.Revisions) {
1406
+ $revisions += @{
1407
+ index = $rev.Index
1408
+ author = $rev.Author
1409
+ type = $rev.Type
1410
+ text = $rev.Range.Text
1411
+ date = $rev.Date.ToString("yyyy-MM-dd HH:mm:ss")
1412
+ }
1413
+ }
1414
+ @{
1415
+ success = $true
1416
+ track_revisions = $doc.TrackRevisions
1417
+ revision_count = $doc.Revisions.Count
1418
+ revisions = $revisions
1419
+ } | ConvertTo-Json -Compress -Depth 5
1420
+ `);
1421
+ }
1422
+ async wordAcceptAllRevisions() {
1423
+ return this.executePowerShell(`
1424
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1425
+ $doc = $word.ActiveDocument
1426
+ $count = $doc.Revisions.Count
1427
+ $doc.AcceptAllRevisions()
1428
+ @{ success = $true; message = "Accepted $count revisions" } | ConvertTo-Json -Compress
1429
+ `);
1430
+ }
1431
+ async wordRejectAllRevisions() {
1432
+ return this.executePowerShell(`
1433
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1434
+ $doc = $word.ActiveDocument
1435
+ $count = $doc.Revisions.Count
1436
+ $doc.RejectAllRevisions()
1437
+ @{ success = $true; message = "Rejected $count revisions" } | ConvertTo-Json -Compress
1438
+ `);
1439
+ }
1440
+ async wordHandleRevision(index, accept) {
1441
+ const method = accept ? 'Accept' : 'Reject';
1442
+ return this.executePowerShell(`
1443
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1444
+ $doc = $word.ActiveDocument
1445
+ if (${index} -le $doc.Revisions.Count) {
1446
+ $doc.Revisions(${index}).${method}()
1447
+ @{ success = $true; message = "Revision ${index} ${accept ? 'accepted' : 'rejected'}" } | ConvertTo-Json -Compress
1448
+ } else {
1449
+ @{ success = $false; error = "Revision index ${index} out of range" } | ConvertTo-Json -Compress
1450
+ }
1451
+ `);
1452
+ }
1453
+ async wordInsertTOC(options) {
1454
+ const useHeadingStyles = options?.useHeadingStyles !== false ? '$true' : '$false';
1455
+ const upperLevel = options?.upperHeadingLevel ?? 1;
1456
+ const lowerLevel = options?.lowerHeadingLevel ?? 3;
1457
+ const useHyperlinks = options?.useHyperlinks !== false ? '$true' : '$false';
1458
+ return this.executePowerShell(`
1459
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1460
+ $doc = $word.ActiveDocument
1461
+ $selection = $word.Selection
1462
+ $range = $selection.Range
1463
+ $toc = $doc.TablesOfContents.Add($range, ${useHeadingStyles}, ${upperLevel}, ${lowerLevel}, $false, "", $true, ${useHyperlinks})
1464
+ @{ success = $true; message = "Table of contents inserted (Heading ${upperLevel}-${lowerLevel})" } | ConvertTo-Json -Compress
1465
+ `);
1466
+ }
1467
+ async wordUpdateTOC() {
1468
+ return this.executePowerShell(`
1469
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1470
+ $doc = $word.ActiveDocument
1471
+ $count = $doc.TablesOfContents.Count
1472
+ foreach ($toc in $doc.TablesOfContents) {
1473
+ $toc.Update()
1474
+ }
1475
+ @{ success = $true; message = "Updated $count table(s) of contents" } | ConvertTo-Json -Compress
1476
+ `);
1477
+ }
1478
+ async wordDeleteTOC() {
1479
+ return this.executePowerShell(`
1480
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1481
+ $doc = $word.ActiveDocument
1482
+ $count = $doc.TablesOfContents.Count
1483
+ while ($doc.TablesOfContents.Count -gt 0) {
1484
+ $doc.TablesOfContents(1).Delete()
1485
+ }
1486
+ @{ success = $true; message = "Deleted $count table(s) of contents" } | ConvertTo-Json -Compress
1487
+ `);
1488
+ }
1489
+ async wordAddFootnote(text) {
1490
+ const hasKorean = /[가-힣ㄱ-ㅎㅏ-ㅣ]/.test(text);
1491
+ const base64Text = this.encodeTextForPowerShell(text);
1492
+ const decodeExpr = this.getPowerShellDecodeExpr(base64Text);
1493
+ return this.executePowerShell(`
1494
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1495
+ $doc = $word.ActiveDocument
1496
+ $selection = $word.Selection
1497
+ $footnote = $doc.Footnotes.Add($selection.Range)
1498
+ $footnote.Range.Text = ${decodeExpr}
1499
+ ${hasKorean ? "$footnote.Range.Font.Name = 'Malgun Gothic'" : ''}
1500
+ @{ success = $true; message = "Footnote added"; index = $footnote.Index } | ConvertTo-Json -Compress
1501
+ `);
1502
+ }
1503
+ async wordAddEndnote(text) {
1504
+ const hasKorean = /[가-힣ㄱ-ㅎㅏ-ㅣ]/.test(text);
1505
+ const base64Text = this.encodeTextForPowerShell(text);
1506
+ const decodeExpr = this.getPowerShellDecodeExpr(base64Text);
1507
+ return this.executePowerShell(`
1508
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1509
+ $doc = $word.ActiveDocument
1510
+ $selection = $word.Selection
1511
+ $endnote = $doc.Endnotes.Add($selection.Range)
1512
+ $endnote.Range.Text = ${decodeExpr}
1513
+ ${hasKorean ? "$endnote.Range.Font.Name = 'Malgun Gothic'" : ''}
1514
+ @{ success = $true; message = "Endnote added"; index = $endnote.Index } | ConvertTo-Json -Compress
1515
+ `);
1516
+ }
1517
+ async wordGetFootnotes() {
1518
+ return this.executePowerShell(`
1519
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1520
+ $doc = $word.ActiveDocument
1521
+ $footnotes = @()
1522
+ foreach ($fn in $doc.Footnotes) {
1523
+ $footnotes += @{
1524
+ index = $fn.Index
1525
+ text = $fn.Range.Text
1526
+ reference_text = $fn.Reference.Text
1527
+ }
1528
+ }
1529
+ @{ success = $true; footnotes = $footnotes; count = $doc.Footnotes.Count } | ConvertTo-Json -Compress -Depth 5
1530
+ `);
1531
+ }
1532
+ async wordGetEndnotes() {
1533
+ return this.executePowerShell(`
1534
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1535
+ $doc = $word.ActiveDocument
1536
+ $endnotes = @()
1537
+ foreach ($en in $doc.Endnotes) {
1538
+ $endnotes += @{
1539
+ index = $en.Index
1540
+ text = $en.Range.Text
1541
+ reference_text = $en.Reference.Text
1542
+ }
1543
+ }
1544
+ @{ success = $true; endnotes = $endnotes; count = $doc.Endnotes.Count } | ConvertTo-Json -Compress -Depth 5
1545
+ `);
1546
+ }
1547
+ async wordDeleteFootnote(index) {
1548
+ return this.executePowerShell(`
1549
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1550
+ $doc = $word.ActiveDocument
1551
+ if (${index} -le $doc.Footnotes.Count) {
1552
+ $doc.Footnotes(${index}).Delete()
1553
+ @{ success = $true; message = "Footnote ${index} deleted" } | ConvertTo-Json -Compress
1554
+ } else {
1555
+ @{ success = $false; error = "Footnote index ${index} out of range" } | ConvertTo-Json -Compress
1556
+ }
1557
+ `);
1558
+ }
1559
+ async wordDeleteEndnote(index) {
1560
+ return this.executePowerShell(`
1561
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1562
+ $doc = $word.ActiveDocument
1563
+ if (${index} -le $doc.Endnotes.Count) {
1564
+ $doc.Endnotes(${index}).Delete()
1565
+ @{ success = $true; message = "Endnote ${index} deleted" } | ConvertTo-Json -Compress
1566
+ } else {
1567
+ @{ success = $false; error = "Endnote index ${index} out of range" } | ConvertTo-Json -Compress
1568
+ }
1569
+ `);
1570
+ }
1571
+ async wordFind(text, options) {
1572
+ const base64Text = this.encodeTextForPowerShell(text);
1573
+ const decodeExpr = this.getPowerShellDecodeExpr(base64Text);
1574
+ const matchCase = options?.matchCase ? '$true' : '$false';
1575
+ const matchWholeWord = options?.matchWholeWord ? '$true' : '$false';
1576
+ return this.executePowerShell(`
1577
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1578
+ $doc = $word.ActiveDocument
1579
+ $selection = $word.Selection
1580
+ $selection.HomeKey(6) # Move to start of document
1581
+ $searchText = ${decodeExpr}
1582
+ $find = $selection.Find
1583
+ $find.ClearFormatting()
1584
+ $find.Text = $searchText
1585
+ $find.MatchCase = ${matchCase}
1586
+ $find.MatchWholeWord = ${matchWholeWord}
1587
+ $find.Forward = $true
1588
+ $find.Wrap = 0 # wdFindStop
1589
+
1590
+ $found = $find.Execute()
1591
+ if ($found) {
1592
+ @{
1593
+ success = $true
1594
+ found = $true
1595
+ start = $selection.Start
1596
+ end = $selection.End
1597
+ text = $selection.Text
1598
+ } | ConvertTo-Json -Compress
1599
+ } else {
1600
+ @{ success = $true; found = $false; message = "Text not found" } | ConvertTo-Json -Compress
1601
+ }
1602
+ `);
1603
+ }
1604
+ async wordFindAll(text, options) {
1605
+ const base64Text = this.encodeTextForPowerShell(text);
1606
+ const decodeExpr = this.getPowerShellDecodeExpr(base64Text);
1607
+ const matchCase = options?.matchCase ? '$true' : '$false';
1608
+ const matchWholeWord = options?.matchWholeWord ? '$true' : '$false';
1609
+ return this.executePowerShell(`
1610
+ $word = [Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
1611
+ $doc = $word.ActiveDocument
1612
+ $range = $doc.Content
1613
+ $searchText = ${decodeExpr}
1614
+ $find = $range.Find
1615
+ $find.ClearFormatting()
1616
+ $find.Text = $searchText
1617
+ $find.MatchCase = ${matchCase}
1618
+ $find.MatchWholeWord = ${matchWholeWord}
1619
+ $find.Forward = $true
1620
+
1621
+ $matches = @()
1622
+ while ($find.Execute()) {
1623
+ $matches += @{
1624
+ start = $range.Start
1625
+ end = $range.End
1626
+ text = $range.Text
1627
+ }
1628
+ $range.Collapse(0) # wdCollapseEnd
1629
+ }
1630
+
1631
+ @{ success = $true; count = $matches.Count; matches = $matches } | ConvertTo-Json -Compress -Depth 5
1632
+ `);
1633
+ }
1634
+ }
1635
+ export const wordClient = new WordClient();
1636
+ //# sourceMappingURL=word-client.js.map