whale-code 6.5.4 → 6.5.6

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 (853) hide show
  1. package/README.md +39 -31
  2. package/bin/{swagmanager-mcp.js → whale-code.js} +17 -2
  3. package/dist/cli/app.js +148 -72
  4. package/dist/cli/app.js.map +1 -0
  5. package/dist/cli/chat/AgentSelector.js +105 -10
  6. package/dist/cli/chat/AgentSelector.js.map +1 -0
  7. package/dist/cli/chat/ChatApp.d.ts +31 -0
  8. package/dist/cli/chat/ChatApp.js +539 -286
  9. package/dist/cli/chat/ChatApp.js.map +1 -0
  10. package/dist/cli/chat/ChatInput.js +1088 -770
  11. package/dist/cli/chat/ChatInput.js.map +1 -0
  12. package/dist/cli/chat/MarkdownText.js +39 -14
  13. package/dist/cli/chat/MarkdownText.js.map +1 -0
  14. package/dist/cli/chat/MemoryManager.js +181 -46
  15. package/dist/cli/chat/MemoryManager.js.map +1 -0
  16. package/dist/cli/chat/MessageList.d.ts +2 -3
  17. package/dist/cli/chat/MessageList.js +186 -45
  18. package/dist/cli/chat/MessageList.js.map +1 -0
  19. package/dist/cli/chat/ModelSelector.js +282 -63
  20. package/dist/cli/chat/ModelSelector.js.map +1 -0
  21. package/dist/cli/chat/NodeManager.js +165 -75
  22. package/dist/cli/chat/NodeManager.js.map +1 -0
  23. package/dist/cli/chat/NodeSelector.js +171 -30
  24. package/dist/cli/chat/NodeSelector.js.map +1 -0
  25. package/dist/cli/chat/PlanApproval.js +281 -57
  26. package/dist/cli/chat/PlanApproval.js.map +1 -0
  27. package/dist/cli/chat/RewindViewer.js +559 -144
  28. package/dist/cli/chat/RewindViewer.js.map +1 -0
  29. package/dist/cli/chat/SessionManager.js +137 -30
  30. package/dist/cli/chat/SessionManager.js.map +1 -0
  31. package/dist/cli/chat/SlashMenu.js +293 -164
  32. package/dist/cli/chat/SlashMenu.js.map +1 -0
  33. package/dist/cli/chat/StatusBar.js +172 -9
  34. package/dist/cli/chat/StatusBar.js.map +1 -0
  35. package/dist/cli/chat/StoreSelector.js +147 -18
  36. package/dist/cli/chat/StoreSelector.js.map +1 -0
  37. package/dist/cli/chat/StreamingText.d.ts +1 -5
  38. package/dist/cli/chat/StreamingText.js +22 -7
  39. package/dist/cli/chat/StreamingText.js.map +1 -0
  40. package/dist/cli/chat/SubagentPanel.d.ts +1 -2
  41. package/dist/cli/chat/SubagentPanel.js +612 -72
  42. package/dist/cli/chat/SubagentPanel.js.map +1 -0
  43. package/dist/cli/chat/TeamPanel.d.ts +1 -0
  44. package/dist/cli/chat/TeamPanel.js +230 -30
  45. package/dist/cli/chat/TeamPanel.js.map +1 -0
  46. package/dist/cli/chat/ThemeSelector.js +84 -24
  47. package/dist/cli/chat/ThemeSelector.js.map +1 -0
  48. package/dist/cli/chat/ToolIndicator.js +1476 -371
  49. package/dist/cli/chat/ToolIndicator.js.map +1 -0
  50. package/dist/cli/chat/hooks/useAgentLoop.d.ts +1 -0
  51. package/dist/cli/chat/hooks/useAgentLoop.js +481 -367
  52. package/dist/cli/chat/hooks/useAgentLoop.js.map +1 -0
  53. package/dist/cli/chat/hooks/useSlashCommands.d.ts +3 -14
  54. package/dist/cli/chat/hooks/useSlashCommands.js +744 -572
  55. package/dist/cli/chat/hooks/useSlashCommands.js.map +1 -0
  56. package/dist/cli/commands/config-cmd.js +56 -57
  57. package/dist/cli/commands/config-cmd.js.map +1 -0
  58. package/dist/cli/commands/db.js +184 -169
  59. package/dist/cli/commands/db.js.map +1 -0
  60. package/dist/cli/commands/doctor.js +212 -122
  61. package/dist/cli/commands/doctor.js.map +1 -0
  62. package/dist/cli/commands/init.js +211 -244
  63. package/dist/cli/commands/init.js.map +1 -0
  64. package/dist/cli/commands/mcp.js +127 -122
  65. package/dist/cli/commands/mcp.js.map +1 -0
  66. package/dist/cli/login/LoginApp.js +355 -141
  67. package/dist/cli/login/LoginApp.js.map +1 -0
  68. package/dist/cli/print-mode.js +196 -177
  69. package/dist/cli/print-mode.js.map +1 -0
  70. package/dist/cli/serve-mode.js +615 -530
  71. package/dist/cli/serve-mode.js.map +1 -0
  72. package/dist/cli/services/agent-config.d.ts +29 -0
  73. package/dist/cli/services/agent-config.js +91 -0
  74. package/dist/cli/services/agent-config.js.map +1 -0
  75. package/dist/cli/services/agent-definitions.d.ts +4 -1
  76. package/dist/cli/services/agent-definitions.js +97 -56
  77. package/dist/cli/services/agent-definitions.js.map +1 -0
  78. package/dist/cli/services/agent-events.js +225 -162
  79. package/dist/cli/services/agent-events.js.map +1 -0
  80. package/dist/cli/services/agent-loop.js +978 -669
  81. package/dist/cli/services/agent-loop.js.map +1 -0
  82. package/dist/cli/services/agent-worker-base.d.ts +35 -5
  83. package/dist/cli/services/agent-worker-base.js +337 -153
  84. package/dist/cli/services/agent-worker-base.js.map +1 -0
  85. package/dist/cli/services/api-retry.js +69 -64
  86. package/dist/cli/services/api-retry.js.map +1 -0
  87. package/dist/cli/services/auth-service.d.ts +3 -3
  88. package/dist/cli/services/auth-service.js +209 -132
  89. package/dist/cli/services/auth-service.js.map +1 -0
  90. package/dist/cli/services/background-processes.js +343 -267
  91. package/dist/cli/services/background-processes.js.map +1 -0
  92. package/dist/cli/services/browser-auth.d.ts +2 -2
  93. package/dist/cli/services/browser-auth.js +159 -118
  94. package/dist/cli/services/browser-auth.js.map +1 -0
  95. package/dist/cli/services/claude-md-loader.js +40 -36
  96. package/dist/cli/services/claude-md-loader.js.map +1 -0
  97. package/dist/cli/services/config-store.d.ts +9 -4
  98. package/dist/cli/services/config-store.js +164 -117
  99. package/dist/cli/services/config-store.js.map +1 -0
  100. package/dist/cli/services/debug-log.d.ts +1 -1
  101. package/dist/cli/services/debug-log.js +34 -35
  102. package/dist/cli/services/debug-log.js.map +1 -0
  103. package/dist/cli/services/env-detect.d.ts +7 -0
  104. package/dist/cli/services/env-detect.js +9 -0
  105. package/dist/cli/services/env-detect.js.map +1 -0
  106. package/dist/cli/services/error-logger.d.ts +2 -3
  107. package/dist/cli/services/error-logger.js +189 -180
  108. package/dist/cli/services/error-logger.js.map +1 -0
  109. package/dist/cli/services/file-history.d.ts +1 -1
  110. package/dist/cli/services/file-history.js +50 -54
  111. package/dist/cli/services/file-history.js.map +1 -0
  112. package/dist/cli/services/format-server-response.js +332 -372
  113. package/dist/cli/services/format-server-response.js.map +1 -0
  114. package/dist/cli/services/git-context.js +61 -45
  115. package/dist/cli/services/git-context.js.map +1 -0
  116. package/dist/cli/services/hooks.d.ts +2 -2
  117. package/dist/cli/services/hooks.js +195 -180
  118. package/dist/cli/services/hooks.js.map +1 -0
  119. package/dist/cli/services/ink-incremental.d.ts +19 -0
  120. package/dist/cli/services/ink-incremental.js +59 -0
  121. package/dist/cli/services/ink-incremental.js.map +1 -0
  122. package/dist/cli/services/ink-resize-fix.js +54 -44
  123. package/dist/cli/services/ink-resize-fix.js.map +1 -0
  124. package/dist/cli/services/ink-sync-output.d.ts +12 -0
  125. package/dist/cli/services/ink-sync-output.js +16 -0
  126. package/dist/cli/services/ink-sync-output.js.map +1 -0
  127. package/dist/cli/services/interactive-tools.js +268 -212
  128. package/dist/cli/services/interactive-tools.js.map +1 -0
  129. package/dist/cli/services/keybinding-manager.d.ts +11 -1
  130. package/dist/cli/services/keybinding-manager.js +126 -63
  131. package/dist/cli/services/keybinding-manager.js.map +1 -0
  132. package/dist/cli/services/local-tools.d.ts +1 -1
  133. package/dist/cli/services/local-tools.js +939 -656
  134. package/dist/cli/services/local-tools.js.map +1 -0
  135. package/dist/cli/services/lsp-manager.js +757 -594
  136. package/dist/cli/services/lsp-manager.js.map +1 -0
  137. package/dist/cli/services/mcp-client.d.ts +1 -1
  138. package/dist/cli/services/mcp-client.js +173 -134
  139. package/dist/cli/services/mcp-client.js.map +1 -0
  140. package/dist/cli/services/memory-manager.js +53 -40
  141. package/dist/cli/services/memory-manager.js.map +1 -0
  142. package/dist/cli/services/model-manager.js +55 -40
  143. package/dist/cli/services/model-manager.js.map +1 -0
  144. package/dist/cli/services/model-router.js +115 -85
  145. package/dist/cli/services/model-router.js.map +1 -0
  146. package/dist/cli/services/paths.d.ts +30 -0
  147. package/dist/cli/services/paths.js +81 -0
  148. package/dist/cli/services/paths.js.map +1 -0
  149. package/dist/cli/services/permission-modes.js +32 -25
  150. package/dist/cli/services/permission-modes.js.map +1 -0
  151. package/dist/cli/services/rewind.js +182 -168
  152. package/dist/cli/services/rewind.js.map +1 -0
  153. package/dist/cli/services/ripgrep.js +115 -115
  154. package/dist/cli/services/ripgrep.js.map +1 -0
  155. package/dist/cli/services/sandbox.d.ts +1 -1
  156. package/dist/cli/services/sandbox.js +58 -37
  157. package/dist/cli/services/sandbox.js.map +1 -0
  158. package/dist/cli/services/server-tools.js +738 -565
  159. package/dist/cli/services/server-tools.js.map +1 -0
  160. package/dist/cli/services/session-persistence.js +69 -74
  161. package/dist/cli/services/session-persistence.js.map +1 -0
  162. package/dist/cli/services/subagent-worker.js +42 -27
  163. package/dist/cli/services/subagent-worker.js.map +1 -0
  164. package/dist/cli/services/subagent.d.ts +2 -0
  165. package/dist/cli/services/subagent.js +606 -430
  166. package/dist/cli/services/subagent.js.map +1 -0
  167. package/dist/cli/services/system-prompt.js +86 -78
  168. package/dist/cli/services/system-prompt.js.map +1 -0
  169. package/dist/cli/services/task-decomposer.d.ts +1 -1
  170. package/dist/cli/services/task-decomposer.js +172 -139
  171. package/dist/cli/services/task-decomposer.js.map +1 -0
  172. package/dist/cli/services/team-lead.d.ts +2 -2
  173. package/dist/cli/services/team-lead.js +727 -529
  174. package/dist/cli/services/team-lead.js.map +1 -0
  175. package/dist/cli/services/team-state.js +319 -319
  176. package/dist/cli/services/team-state.js.map +1 -0
  177. package/dist/cli/services/teammate.d.ts +8 -2
  178. package/dist/cli/services/teammate.js +862 -560
  179. package/dist/cli/services/teammate.js.map +1 -0
  180. package/dist/cli/services/telemetry.d.ts +6 -1
  181. package/dist/cli/services/telemetry.js +180 -157
  182. package/dist/cli/services/telemetry.js.map +1 -0
  183. package/dist/cli/services/tools/agent-tools.d.ts +3 -3
  184. package/dist/cli/services/tools/agent-tools.js +480 -322
  185. package/dist/cli/services/tools/agent-tools.js.map +1 -0
  186. package/dist/cli/services/tools/file-ops.js +563 -450
  187. package/dist/cli/services/tools/file-ops.js.map +1 -0
  188. package/dist/cli/services/tools/search-tools.js +231 -162
  189. package/dist/cli/services/tools/search-tools.js.map +1 -0
  190. package/dist/cli/services/tools/shell-exec.js +197 -151
  191. package/dist/cli/services/tools/shell-exec.js.map +1 -0
  192. package/dist/cli/services/tools/task-manager.js +206 -173
  193. package/dist/cli/services/tools/task-manager.js.map +1 -0
  194. package/dist/cli/services/tools/web-tools.js +388 -341
  195. package/dist/cli/services/tools/web-tools.js.map +1 -0
  196. package/dist/cli/setup/SetupApp.d.ts +2 -2
  197. package/dist/cli/setup/SetupApp.js +608 -160
  198. package/dist/cli/setup/SetupApp.js.map +1 -0
  199. package/dist/cli/shared/ErrorBoundary.d.ts +22 -0
  200. package/dist/cli/shared/ErrorBoundary.js +73 -0
  201. package/dist/cli/shared/ErrorBoundary.js.map +1 -0
  202. package/dist/cli/shared/MatrixIntro.js +66 -69
  203. package/dist/cli/shared/MatrixIntro.js.map +1 -0
  204. package/dist/cli/shared/SpinnerSlot.d.ts +14 -0
  205. package/dist/cli/shared/SpinnerSlot.js +63 -0
  206. package/dist/cli/shared/SpinnerSlot.js.map +1 -0
  207. package/dist/cli/shared/Theme.d.ts +1 -1
  208. package/dist/cli/shared/Theme.js +136 -92
  209. package/dist/cli/shared/Theme.js.map +1 -0
  210. package/dist/cli/shared/WhaleBanner.js +99 -11
  211. package/dist/cli/shared/WhaleBanner.js.map +1 -0
  212. package/dist/cli/shared/markdown.d.ts +3 -1
  213. package/dist/cli/shared/markdown.js +736 -674
  214. package/dist/cli/shared/markdown.js.map +1 -0
  215. package/dist/cli/shared/marked-terminal.d.js +2 -0
  216. package/dist/cli/shared/marked-terminal.d.js.map +1 -0
  217. package/dist/cli/shared/theme-manager.js +99 -90
  218. package/dist/cli/shared/theme-manager.js.map +1 -0
  219. package/dist/cli/shared/theme-presets.js +256 -254
  220. package/dist/cli/shared/theme-presets.js.map +1 -0
  221. package/dist/cli/status/StatusApp.js +235 -86
  222. package/dist/cli/status/StatusApp.js.map +1 -0
  223. package/dist/cli/stores/StoreApp.js +275 -65
  224. package/dist/cli/stores/StoreApp.js.map +1 -0
  225. package/dist/index.d.ts +2 -2
  226. package/dist/index.js +509 -396
  227. package/dist/index.js.map +1 -0
  228. package/dist/local-agent/connection.d.ts +2 -2
  229. package/dist/local-agent/connection.js +352 -293
  230. package/dist/local-agent/connection.js.map +1 -0
  231. package/dist/local-agent/discovery.js +259 -122
  232. package/dist/local-agent/discovery.js.map +1 -0
  233. package/dist/local-agent/executor.js +216 -193
  234. package/dist/local-agent/executor.js.map +1 -0
  235. package/dist/local-agent/index.d.ts +2 -2
  236. package/dist/local-agent/index.js +156 -156
  237. package/dist/local-agent/index.js.map +1 -0
  238. package/dist/node/adapters/base.js +18 -8
  239. package/dist/node/adapters/base.js.map +1 -0
  240. package/dist/node/adapters/discord.js +286 -275
  241. package/dist/node/adapters/discord.js.map +1 -0
  242. package/dist/node/adapters/email.js +189 -202
  243. package/dist/node/adapters/email.js.map +1 -0
  244. package/dist/node/adapters/imessage.js +145 -142
  245. package/dist/node/adapters/imessage.js.map +1 -0
  246. package/dist/node/adapters/slack.js +237 -236
  247. package/dist/node/adapters/slack.js.map +1 -0
  248. package/dist/node/adapters/sms.js +149 -151
  249. package/dist/node/adapters/sms.js.map +1 -0
  250. package/dist/node/adapters/telegram.js +88 -92
  251. package/dist/node/adapters/telegram.js.map +1 -0
  252. package/dist/node/adapters/webchat.js +160 -136
  253. package/dist/node/adapters/webchat.js.map +1 -0
  254. package/dist/node/adapters/whatsapp.js +212 -215
  255. package/dist/node/adapters/whatsapp.js.map +1 -0
  256. package/dist/node/cli.js +884 -653
  257. package/dist/node/cli.js.map +1 -0
  258. package/dist/node/config.js +20 -18
  259. package/dist/node/config.js.map +1 -0
  260. package/dist/node/gateway-client.js +191 -181
  261. package/dist/node/gateway-client.js.map +1 -0
  262. package/dist/node/portal/clipboard.js +161 -130
  263. package/dist/node/portal/clipboard.js.map +1 -0
  264. package/dist/node/portal/discovery.js +51 -45
  265. package/dist/node/portal/discovery.js.map +1 -0
  266. package/dist/node/portal/forward.js +64 -58
  267. package/dist/node/portal/forward.js.map +1 -0
  268. package/dist/node/portal/index.js +246 -221
  269. package/dist/node/portal/index.js.map +1 -0
  270. package/dist/node/portal/multiplexer.js +192 -182
  271. package/dist/node/portal/multiplexer.js.map +1 -0
  272. package/dist/node/portal/permissions.js +102 -70
  273. package/dist/node/portal/permissions.js.map +1 -0
  274. package/dist/node/portal/protocol.js +153 -116
  275. package/dist/node/portal/protocol.js.map +1 -0
  276. package/dist/node/portal/screen.js +80 -69
  277. package/dist/node/portal/screen.js.map +1 -0
  278. package/dist/node/portal/session.js +124 -117
  279. package/dist/node/portal/session.js.map +1 -0
  280. package/dist/node/portal/shell.js +140 -113
  281. package/dist/node/portal/shell.js.map +1 -0
  282. package/dist/node/portal/stream.js +77 -75
  283. package/dist/node/portal/stream.js.map +1 -0
  284. package/dist/node/portal/transfer.js +190 -167
  285. package/dist/node/portal/transfer.js.map +1 -0
  286. package/dist/node/portal/ui.js +124 -99
  287. package/dist/node/portal/ui.js.map +1 -0
  288. package/dist/node/remote-desktop/compile-helper.js +50 -45
  289. package/dist/node/remote-desktop/compile-helper.js.map +1 -0
  290. package/dist/node/remote-desktop/index.js +215 -187
  291. package/dist/node/remote-desktop/index.js.map +1 -0
  292. package/dist/node/remote-desktop/protocol.js +45 -29
  293. package/dist/node/remote-desktop/protocol.js.map +1 -0
  294. package/dist/node/runtime.js +493 -410
  295. package/dist/node/runtime.js.map +1 -0
  296. package/dist/server/handlers/__test-utils__/test-db.js +39 -89
  297. package/dist/server/handlers/__test-utils__/test-db.js.map +1 -0
  298. package/dist/server/handlers/analytics.js +467 -261
  299. package/dist/server/handlers/analytics.js.map +1 -0
  300. package/dist/server/handlers/api-docs.d.ts +6 -0
  301. package/dist/server/handlers/api-docs.js +1613 -0
  302. package/dist/server/handlers/api-docs.js.map +1 -0
  303. package/dist/server/handlers/api-keys.js +295 -232
  304. package/dist/server/handlers/api-keys.js.map +1 -0
  305. package/dist/server/handlers/billing.js +330 -239
  306. package/dist/server/handlers/billing.js.map +1 -0
  307. package/dist/server/handlers/browser.js +468 -395
  308. package/dist/server/handlers/browser.js.map +1 -0
  309. package/dist/server/handlers/catalog.js +1377 -978
  310. package/dist/server/handlers/catalog.js.map +1 -0
  311. package/dist/server/handlers/clickhouse.js +157 -109
  312. package/dist/server/handlers/clickhouse.js.map +1 -0
  313. package/dist/server/handlers/comms.d.ts +0 -53
  314. package/dist/server/handlers/comms.js +1443 -970
  315. package/dist/server/handlers/comms.js.map +1 -0
  316. package/dist/server/handlers/creations.js +461 -394
  317. package/dist/server/handlers/creations.js.map +1 -0
  318. package/dist/server/handlers/crm.js +1082 -791
  319. package/dist/server/handlers/crm.js.map +1 -0
  320. package/dist/server/handlers/discovery.js +251 -232
  321. package/dist/server/handlers/discovery.js.map +1 -0
  322. package/dist/server/handlers/embeddings.js +241 -164
  323. package/dist/server/handlers/embeddings.js.map +1 -0
  324. package/dist/server/handlers/enrichment.js +887 -718
  325. package/dist/server/handlers/enrichment.js.map +1 -0
  326. package/dist/server/handlers/image-gen.js +467 -376
  327. package/dist/server/handlers/image-gen.js.map +1 -0
  328. package/dist/server/handlers/inventory.js +797 -424
  329. package/dist/server/handlers/inventory.js.map +1 -0
  330. package/dist/server/handlers/kali.js +272 -230
  331. package/dist/server/handlers/kali.js.map +1 -0
  332. package/dist/server/handlers/llm-providers.js +803 -580
  333. package/dist/server/handlers/llm-providers.js.map +1 -0
  334. package/dist/server/handlers/local-agent.js +133 -105
  335. package/dist/server/handlers/local-agent.js.map +1 -0
  336. package/dist/server/handlers/media.js +1179 -857
  337. package/dist/server/handlers/media.js.map +1 -0
  338. package/dist/server/handlers/meta-ads.js +2669 -2093
  339. package/dist/server/handlers/meta-ads.js.map +1 -0
  340. package/dist/server/handlers/nodes.js +1321 -913
  341. package/dist/server/handlers/nodes.js.map +1 -0
  342. package/dist/server/handlers/operations.js +183 -157
  343. package/dist/server/handlers/operations.js.map +1 -0
  344. package/dist/server/handlers/platform.js +346 -210
  345. package/dist/server/handlers/platform.js.map +1 -0
  346. package/dist/server/handlers/remove-bg.js +118 -86
  347. package/dist/server/handlers/remove-bg.js.map +1 -0
  348. package/dist/server/handlers/storefront.js +586 -446
  349. package/dist/server/handlers/storefront.js.map +1 -0
  350. package/dist/server/handlers/supply-chain.js +546 -326
  351. package/dist/server/handlers/supply-chain.js.map +1 -0
  352. package/dist/server/handlers/transcription.js +106 -97
  353. package/dist/server/handlers/transcription.js.map +1 -0
  354. package/dist/server/handlers/video-gen.js +593 -424
  355. package/dist/server/handlers/video-gen.js.map +1 -0
  356. package/dist/server/handlers/voice.js +1458 -1017
  357. package/dist/server/handlers/voice.js.map +1 -0
  358. package/dist/server/handlers/workflow-steps.js +2837 -2116
  359. package/dist/server/handlers/workflow-steps.js.map +1 -0
  360. package/dist/server/handlers/workflows.js +1630 -933
  361. package/dist/server/handlers/workflows.js.map +1 -0
  362. package/dist/server/index.js +3166 -2390
  363. package/dist/server/index.js.map +1 -0
  364. package/dist/server/lib/batch-client.js +471 -409
  365. package/dist/server/lib/batch-client.js.map +1 -0
  366. package/dist/server/lib/clickhouse-buffer.js +118 -104
  367. package/dist/server/lib/clickhouse-buffer.js.map +1 -0
  368. package/dist/server/lib/clickhouse-client.js +107 -107
  369. package/dist/server/lib/clickhouse-client.js.map +1 -0
  370. package/dist/server/lib/coa-renderer.js +1786 -356
  371. package/dist/server/lib/coa-renderer.js.map +1 -0
  372. package/dist/server/lib/code-worker-pool.js +227 -177
  373. package/dist/server/lib/code-worker-pool.js.map +1 -0
  374. package/dist/server/lib/code-worker.js +174 -164
  375. package/dist/server/lib/code-worker.js.map +1 -0
  376. package/dist/server/lib/compaction-service.d.ts +2 -12
  377. package/dist/server/lib/compaction-service.js +74 -184
  378. package/dist/server/lib/compaction-service.js.map +1 -0
  379. package/dist/server/lib/logger.js +36 -24
  380. package/dist/server/lib/logger.js.map +1 -0
  381. package/dist/server/lib/otel.js +101 -80
  382. package/dist/server/lib/otel.js.map +1 -0
  383. package/dist/server/lib/pdf-renderer.d.ts +1 -1
  384. package/dist/server/lib/pdf-renderer.js +954 -776
  385. package/dist/server/lib/pdf-renderer.js.map +1 -0
  386. package/dist/server/lib/prompt-sanitizer.js +188 -108
  387. package/dist/server/lib/prompt-sanitizer.js.map +1 -0
  388. package/dist/server/lib/provider-capabilities.js +136 -138
  389. package/dist/server/lib/provider-capabilities.js.map +1 -0
  390. package/dist/server/lib/provider-failover.js +190 -168
  391. package/dist/server/lib/provider-failover.js.map +1 -0
  392. package/dist/server/lib/rate-limiter.js +186 -117
  393. package/dist/server/lib/rate-limiter.js.map +1 -0
  394. package/dist/server/lib/react-pdf-layout.js +551 -382
  395. package/dist/server/lib/react-pdf-layout.js.map +1 -0
  396. package/dist/server/lib/server-agent-loop.d.ts +9 -0
  397. package/dist/server/lib/server-agent-loop.js +906 -624
  398. package/dist/server/lib/server-agent-loop.js.map +1 -0
  399. package/dist/server/lib/server-subagent.d.ts +2 -0
  400. package/dist/server/lib/server-subagent.js +260 -162
  401. package/dist/server/lib/server-subagent.js.map +1 -0
  402. package/dist/server/lib/session-checkpoint.js +105 -96
  403. package/dist/server/lib/session-checkpoint.js.map +1 -0
  404. package/dist/server/lib/ssrf-guard.js +193 -184
  405. package/dist/server/lib/ssrf-guard.js.map +1 -0
  406. package/dist/server/lib/supabase-client.js +94 -82
  407. package/dist/server/lib/supabase-client.js.map +1 -0
  408. package/dist/server/lib/template-resolver.js +154 -176
  409. package/dist/server/lib/template-resolver.js.map +1 -0
  410. package/dist/server/lib/utils.js +242 -133
  411. package/dist/server/lib/utils.js.map +1 -0
  412. package/dist/server/local-agent-gateway.d.ts +2 -2
  413. package/dist/server/local-agent-gateway.js +785 -627
  414. package/dist/server/local-agent-gateway.js.map +1 -0
  415. package/dist/server/providers/anthropic.js +254 -176
  416. package/dist/server/providers/anthropic.js.map +1 -0
  417. package/dist/server/providers/bedrock.js +221 -162
  418. package/dist/server/providers/bedrock.js.map +1 -0
  419. package/dist/server/providers/gemini.js +548 -418
  420. package/dist/server/providers/gemini.js.map +1 -0
  421. package/dist/server/providers/openai.js +571 -437
  422. package/dist/server/providers/openai.js.map +1 -0
  423. package/dist/server/providers/registry.js +23 -18
  424. package/dist/server/providers/registry.js.map +1 -0
  425. package/dist/server/providers/shared.js +123 -95
  426. package/dist/server/providers/shared.js.map +1 -0
  427. package/dist/server/providers/types.js +1 -11
  428. package/dist/server/providers/types.js.map +1 -0
  429. package/dist/server/proxy-handlers.js +209 -165
  430. package/dist/server/proxy-handlers.js.map +1 -0
  431. package/dist/server/tool-router.d.ts +13 -0
  432. package/dist/server/tool-router.js +960 -598
  433. package/dist/server/tool-router.js.map +1 -0
  434. package/dist/server/validation.js +248 -188
  435. package/dist/server/validation.js.map +1 -0
  436. package/dist/server/worker.js +202 -133
  437. package/dist/server/worker.js.map +1 -0
  438. package/dist/setup.d.ts +2 -2
  439. package/dist/setup.js +151 -147
  440. package/dist/setup.js.map +1 -0
  441. package/dist/shared/agent-core.d.ts +191 -24
  442. package/dist/shared/agent-core.js +971 -462
  443. package/dist/shared/agent-core.js.map +1 -0
  444. package/dist/shared/anthropic-types.js +1 -6
  445. package/dist/shared/anthropic-types.js.map +1 -0
  446. package/dist/shared/api-client.d.ts +17 -9
  447. package/dist/shared/api-client.js +419 -327
  448. package/dist/shared/api-client.js.map +1 -0
  449. package/dist/shared/compaction.d.ts +36 -0
  450. package/dist/shared/compaction.js +138 -0
  451. package/dist/shared/compaction.js.map +1 -0
  452. package/dist/shared/constants.js +67 -64
  453. package/dist/shared/constants.js.map +1 -0
  454. package/dist/shared/sse-parser.js +221 -219
  455. package/dist/shared/sse-parser.js.map +1 -0
  456. package/dist/shared/tool-dispatch.d.ts +4 -2
  457. package/dist/shared/tool-dispatch.js +226 -165
  458. package/dist/shared/tool-dispatch.js.map +1 -0
  459. package/dist/shared/types.js +1 -6
  460. package/dist/shared/types.js.map +1 -0
  461. package/dist/types/cli-highlight.d.js +2 -0
  462. package/dist/types/cli-highlight.d.js.map +1 -0
  463. package/dist/types/diff.d.js +2 -0
  464. package/dist/types/diff.d.js.map +1 -0
  465. package/dist/types/pdf-parse.d.js +2 -0
  466. package/dist/types/pdf-parse.d.js.map +1 -0
  467. package/dist/updater.d.ts +1 -1
  468. package/dist/updater.js +118 -92
  469. package/dist/updater.js.map +1 -0
  470. package/dist/webchat/widget.js +227 -380
  471. package/dist/webchat/widget.js.map +1 -0
  472. package/package.json +22 -10
  473. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  474. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  475. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  476. package/vendor/ink/build/apply-styles.js +175 -0
  477. package/vendor/ink/build/build-layout.js +77 -0
  478. package/vendor/ink/build/calculate-wrapped-text.js +53 -0
  479. package/vendor/ink/build/colorize.d.ts +3 -0
  480. package/vendor/ink/build/colorize.js +48 -0
  481. package/vendor/ink/build/colorize.js.map +1 -0
  482. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  483. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  484. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  485. package/vendor/ink/build/components/App.d.ts +18 -0
  486. package/vendor/ink/build/components/App.js +351 -0
  487. package/vendor/ink/build/components/App.js.map +1 -0
  488. package/vendor/ink/build/components/AppContext.d.ts +15 -0
  489. package/vendor/ink/build/components/AppContext.js +11 -0
  490. package/vendor/ink/build/components/AppContext.js.map +1 -0
  491. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  492. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  493. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  494. package/vendor/ink/build/components/Box.d.ts +117 -0
  495. package/vendor/ink/build/components/Box.js +34 -0
  496. package/vendor/ink/build/components/Box.js.map +1 -0
  497. package/vendor/ink/build/components/Color.js +62 -0
  498. package/vendor/ink/build/components/Cursor.d.ts +83 -0
  499. package/vendor/ink/build/components/Cursor.js +53 -0
  500. package/vendor/ink/build/components/Cursor.js.map +1 -0
  501. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  502. package/vendor/ink/build/components/CursorContext.js +8 -0
  503. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  504. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  505. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  506. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  507. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  508. package/vendor/ink/build/components/ErrorOverview.js +84 -0
  509. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  510. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  511. package/vendor/ink/build/components/FocusContext.js +17 -0
  512. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  513. package/vendor/ink/build/components/Newline.d.ts +13 -0
  514. package/vendor/ink/build/components/Newline.js +8 -0
  515. package/vendor/ink/build/components/Newline.js.map +1 -0
  516. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  517. package/vendor/ink/build/components/Spacer.js +11 -0
  518. package/vendor/ink/build/components/Spacer.js.map +1 -0
  519. package/vendor/ink/build/components/Static.d.ts +24 -0
  520. package/vendor/ink/build/components/Static.js +28 -0
  521. package/vendor/ink/build/components/Static.js.map +1 -0
  522. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  523. package/vendor/ink/build/components/StderrContext.js +13 -0
  524. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  525. package/vendor/ink/build/components/StdinContext.d.ts +22 -0
  526. package/vendor/ink/build/components/StdinContext.js +19 -0
  527. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  528. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  529. package/vendor/ink/build/components/StdoutContext.js +13 -0
  530. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  531. package/vendor/ink/build/components/Text.d.ts +55 -0
  532. package/vendor/ink/build/components/Text.js +50 -0
  533. package/vendor/ink/build/components/Text.js.map +1 -0
  534. package/vendor/ink/build/components/Transform.d.ts +16 -0
  535. package/vendor/ink/build/components/Transform.js +15 -0
  536. package/vendor/ink/build/components/Transform.js.map +1 -0
  537. package/vendor/ink/build/cursor-helpers.d.ts +38 -0
  538. package/vendor/ink/build/cursor-helpers.js +56 -0
  539. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  540. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  541. package/vendor/ink/build/devtools-window-polyfill.js +65 -0
  542. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  543. package/vendor/ink/build/devtools.d.ts +1 -0
  544. package/vendor/ink/build/devtools.js +11 -0
  545. package/vendor/ink/build/devtools.js.map +1 -0
  546. package/vendor/ink/build/dom.d.ts +56 -0
  547. package/vendor/ink/build/dom.js +124 -0
  548. package/vendor/ink/build/dom.js.map +1 -0
  549. package/vendor/ink/build/experimental/apply-style.js +140 -0
  550. package/vendor/ink/build/experimental/dom.js +123 -0
  551. package/vendor/ink/build/experimental/output.js +91 -0
  552. package/vendor/ink/build/experimental/reconciler.js +141 -0
  553. package/vendor/ink/build/experimental/renderer.js +81 -0
  554. package/vendor/ink/build/get-max-width.d.ts +3 -0
  555. package/vendor/ink/build/get-max-width.js +10 -0
  556. package/vendor/ink/build/get-max-width.js.map +1 -0
  557. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  558. package/vendor/ink/build/hooks/use-app.js +8 -0
  559. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  560. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  561. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  562. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  563. package/vendor/ink/build/hooks/use-focus-manager.d.ts +28 -0
  564. package/vendor/ink/build/hooks/use-focus-manager.js +17 -0
  565. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  566. package/vendor/ink/build/hooks/use-focus.d.ts +29 -0
  567. package/vendor/ink/build/hooks/use-focus.js +42 -0
  568. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  569. package/vendor/ink/build/hooks/use-input.d.ts +131 -0
  570. package/vendor/ink/build/hooks/use-input.js +124 -0
  571. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  572. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +5 -0
  573. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +11 -0
  574. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  575. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  576. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  577. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  578. package/vendor/ink/build/hooks/use-stdin.d.ts +5 -0
  579. package/vendor/ink/build/hooks/use-stdin.js +8 -0
  580. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  581. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  582. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  583. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  584. package/vendor/ink/build/hooks/useInput.js +38 -0
  585. package/vendor/ink/build/index.d.ts +34 -0
  586. package/vendor/ink/build/index.js +20 -0
  587. package/vendor/ink/build/index.js.map +1 -0
  588. package/vendor/ink/build/ink.d.ts +90 -0
  589. package/vendor/ink/build/ink.js +654 -0
  590. package/vendor/ink/build/ink.js.map +1 -0
  591. package/vendor/ink/build/input-parser.d.ts +7 -0
  592. package/vendor/ink/build/input-parser.js +154 -0
  593. package/vendor/ink/build/input-parser.js.map +1 -0
  594. package/vendor/ink/build/instance.js +205 -0
  595. package/vendor/ink/build/instances.d.ts +3 -0
  596. package/vendor/ink/build/instances.js +8 -0
  597. package/vendor/ink/build/instances.js.map +1 -0
  598. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  599. package/vendor/ink/build/kitty-keyboard.js +32 -0
  600. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  601. package/vendor/ink/build/layout.d.ts +7 -0
  602. package/vendor/ink/build/layout.js +33 -0
  603. package/vendor/ink/build/layout.js.map +1 -0
  604. package/vendor/ink/build/log-update.d.ts +19 -0
  605. package/vendor/ink/build/log-update.js +243 -0
  606. package/vendor/ink/build/log-update.js.map +1 -0
  607. package/vendor/ink/build/measure-element.d.ts +16 -0
  608. package/vendor/ink/build/measure-element.js +9 -0
  609. package/vendor/ink/build/measure-element.js.map +1 -0
  610. package/vendor/ink/build/measure-text.d.ts +6 -0
  611. package/vendor/ink/build/measure-text.js +21 -0
  612. package/vendor/ink/build/measure-text.js.map +1 -0
  613. package/vendor/ink/build/options.d.ts +52 -0
  614. package/vendor/ink/build/options.js +2 -0
  615. package/vendor/ink/build/options.js.map +1 -0
  616. package/vendor/ink/build/output.d.ts +35 -0
  617. package/vendor/ink/build/output.js +183 -0
  618. package/vendor/ink/build/output.js.map +1 -0
  619. package/vendor/ink/build/parse-keypress.d.ts +22 -0
  620. package/vendor/ink/build/parse-keypress.js +493 -0
  621. package/vendor/ink/build/parse-keypress.js.map +1 -0
  622. package/vendor/ink/build/reconciler.d.ts +4 -0
  623. package/vendor/ink/build/reconciler.js +274 -0
  624. package/vendor/ink/build/reconciler.js.map +1 -0
  625. package/vendor/ink/build/render-background.d.ts +4 -0
  626. package/vendor/ink/build/render-background.js +25 -0
  627. package/vendor/ink/build/render-background.js.map +1 -0
  628. package/vendor/ink/build/render-border.d.ts +4 -0
  629. package/vendor/ink/build/render-border.js +73 -0
  630. package/vendor/ink/build/render-border.js.map +1 -0
  631. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  632. package/vendor/ink/build/render-node-to-output.js +147 -0
  633. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  634. package/vendor/ink/build/render-to-string.d.ts +38 -0
  635. package/vendor/ink/build/render-to-string.js +115 -0
  636. package/vendor/ink/build/render-to-string.js.map +1 -0
  637. package/vendor/ink/build/render.d.ts +121 -0
  638. package/vendor/ink/build/render.js +55 -0
  639. package/vendor/ink/build/render.js.map +1 -0
  640. package/vendor/ink/build/renderer.d.ts +8 -0
  641. package/vendor/ink/build/renderer.js +55 -0
  642. package/vendor/ink/build/renderer.js.map +1 -0
  643. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  644. package/vendor/ink/build/sanitize-ansi.js +27 -0
  645. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  646. package/vendor/ink/build/screen-reader-update.d.ts +13 -0
  647. package/vendor/ink/build/screen-reader-update.js +38 -0
  648. package/vendor/ink/build/screen-reader-update.js.map +1 -0
  649. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  650. package/vendor/ink/build/squash-text-nodes.js +36 -0
  651. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  652. package/vendor/ink/build/styles.d.ts +240 -0
  653. package/vendor/ink/build/styles.js +232 -0
  654. package/vendor/ink/build/styles.js.map +1 -0
  655. package/vendor/ink/build/utils.d.ts +2 -0
  656. package/vendor/ink/build/utils.js +4 -0
  657. package/vendor/ink/build/utils.js.map +1 -0
  658. package/vendor/ink/build/wrap-text.d.ts +3 -0
  659. package/vendor/ink/build/wrap-text.js +31 -0
  660. package/vendor/ink/build/wrap-text.js.map +1 -0
  661. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  662. package/vendor/ink/build/write-synchronized.js +7 -0
  663. package/vendor/ink/build/write-synchronized.js.map +1 -0
  664. package/vendor/ink/license +10 -0
  665. package/vendor/ink/node_modules/@types/node/LICENSE +21 -0
  666. package/vendor/ink/node_modules/@types/node/README.md +15 -0
  667. package/vendor/ink/node_modules/@types/node/assert/strict.d.ts +105 -0
  668. package/vendor/ink/node_modules/@types/node/assert.d.ts +955 -0
  669. package/vendor/ink/node_modules/@types/node/async_hooks.d.ts +623 -0
  670. package/vendor/ink/node_modules/@types/node/buffer.buffer.d.ts +466 -0
  671. package/vendor/ink/node_modules/@types/node/buffer.d.ts +1810 -0
  672. package/vendor/ink/node_modules/@types/node/child_process.d.ts +1428 -0
  673. package/vendor/ink/node_modules/@types/node/cluster.d.ts +486 -0
  674. package/vendor/ink/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
  675. package/vendor/ink/node_modules/@types/node/console.d.ts +151 -0
  676. package/vendor/ink/node_modules/@types/node/constants.d.ts +20 -0
  677. package/vendor/ink/node_modules/@types/node/crypto.d.ts +4065 -0
  678. package/vendor/ink/node_modules/@types/node/dgram.d.ts +564 -0
  679. package/vendor/ink/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
  680. package/vendor/ink/node_modules/@types/node/dns/promises.d.ts +503 -0
  681. package/vendor/ink/node_modules/@types/node/dns.d.ts +922 -0
  682. package/vendor/ink/node_modules/@types/node/domain.d.ts +166 -0
  683. package/vendor/ink/node_modules/@types/node/events.d.ts +1054 -0
  684. package/vendor/ink/node_modules/@types/node/fs/promises.d.ts +1329 -0
  685. package/vendor/ink/node_modules/@types/node/fs.d.ts +4676 -0
  686. package/vendor/ink/node_modules/@types/node/globals.d.ts +150 -0
  687. package/vendor/ink/node_modules/@types/node/globals.typedarray.d.ts +101 -0
  688. package/vendor/ink/node_modules/@types/node/http.d.ts +2167 -0
  689. package/vendor/ink/node_modules/@types/node/http2.d.ts +2480 -0
  690. package/vendor/ink/node_modules/@types/node/https.d.ts +405 -0
  691. package/vendor/ink/node_modules/@types/node/index.d.ts +115 -0
  692. package/vendor/ink/node_modules/@types/node/inspector/promises.d.ts +41 -0
  693. package/vendor/ink/node_modules/@types/node/inspector.d.ts +224 -0
  694. package/vendor/ink/node_modules/@types/node/inspector.generated.d.ts +4226 -0
  695. package/vendor/ink/node_modules/@types/node/module.d.ts +819 -0
  696. package/vendor/ink/node_modules/@types/node/net.d.ts +933 -0
  697. package/vendor/ink/node_modules/@types/node/os.d.ts +507 -0
  698. package/vendor/ink/node_modules/@types/node/package.json +155 -0
  699. package/vendor/ink/node_modules/@types/node/path/posix.d.ts +8 -0
  700. package/vendor/ink/node_modules/@types/node/path/win32.d.ts +8 -0
  701. package/vendor/ink/node_modules/@types/node/path.d.ts +187 -0
  702. package/vendor/ink/node_modules/@types/node/perf_hooks.d.ts +643 -0
  703. package/vendor/ink/node_modules/@types/node/process.d.ts +2156 -0
  704. package/vendor/ink/node_modules/@types/node/punycode.d.ts +117 -0
  705. package/vendor/ink/node_modules/@types/node/querystring.d.ts +152 -0
  706. package/vendor/ink/node_modules/@types/node/quic.d.ts +910 -0
  707. package/vendor/ink/node_modules/@types/node/readline/promises.d.ts +161 -0
  708. package/vendor/ink/node_modules/@types/node/readline.d.ts +541 -0
  709. package/vendor/ink/node_modules/@types/node/repl.d.ts +415 -0
  710. package/vendor/ink/node_modules/@types/node/sea.d.ts +162 -0
  711. package/vendor/ink/node_modules/@types/node/sqlite.d.ts +955 -0
  712. package/vendor/ink/node_modules/@types/node/stream/consumers.d.ts +38 -0
  713. package/vendor/ink/node_modules/@types/node/stream/promises.d.ts +211 -0
  714. package/vendor/ink/node_modules/@types/node/stream/web.d.ts +296 -0
  715. package/vendor/ink/node_modules/@types/node/stream.d.ts +1760 -0
  716. package/vendor/ink/node_modules/@types/node/string_decoder.d.ts +67 -0
  717. package/vendor/ink/node_modules/@types/node/test/reporters.d.ts +96 -0
  718. package/vendor/ink/node_modules/@types/node/test.d.ts +2240 -0
  719. package/vendor/ink/node_modules/@types/node/timers/promises.d.ts +108 -0
  720. package/vendor/ink/node_modules/@types/node/timers.d.ts +159 -0
  721. package/vendor/ink/node_modules/@types/node/tls.d.ts +1198 -0
  722. package/vendor/ink/node_modules/@types/node/trace_events.d.ts +197 -0
  723. package/vendor/ink/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
  724. package/vendor/ink/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  725. package/vendor/ink/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
  726. package/vendor/ink/node_modules/@types/node/ts5.6/index.d.ts +117 -0
  727. package/vendor/ink/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  728. package/vendor/ink/node_modules/@types/node/ts5.7/index.d.ts +117 -0
  729. package/vendor/ink/node_modules/@types/node/tty.d.ts +250 -0
  730. package/vendor/ink/node_modules/@types/node/url.d.ts +519 -0
  731. package/vendor/ink/node_modules/@types/node/util/types.d.ts +558 -0
  732. package/vendor/ink/node_modules/@types/node/util.d.ts +1662 -0
  733. package/vendor/ink/node_modules/@types/node/v8.d.ts +983 -0
  734. package/vendor/ink/node_modules/@types/node/vm.d.ts +1208 -0
  735. package/vendor/ink/node_modules/@types/node/wasi.d.ts +202 -0
  736. package/vendor/ink/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
  737. package/vendor/ink/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  738. package/vendor/ink/node_modules/@types/node/web-globals/console.d.ts +9 -0
  739. package/vendor/ink/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  740. package/vendor/ink/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  741. package/vendor/ink/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  742. package/vendor/ink/node_modules/@types/node/web-globals/events.d.ts +106 -0
  743. package/vendor/ink/node_modules/@types/node/web-globals/fetch.d.ts +69 -0
  744. package/vendor/ink/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  745. package/vendor/ink/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  746. package/vendor/ink/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
  747. package/vendor/ink/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  748. package/vendor/ink/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  749. package/vendor/ink/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  750. package/vendor/ink/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  751. package/vendor/ink/node_modules/@types/node/web-globals/url.d.ts +24 -0
  752. package/vendor/ink/node_modules/@types/node/worker_threads.d.ts +717 -0
  753. package/vendor/ink/node_modules/@types/node/zlib.d.ts +618 -0
  754. package/vendor/ink/node_modules/node-pty/LICENSE +69 -0
  755. package/vendor/ink/node_modules/node-pty/README.md +164 -0
  756. package/vendor/ink/node_modules/node-pty/binding.gyp +150 -0
  757. package/vendor/ink/node_modules/node-pty/lib/conpty_console_list_agent.js +25 -0
  758. package/vendor/ink/node_modules/node-pty/lib/eventEmitter2.js +47 -0
  759. package/vendor/ink/node_modules/node-pty/lib/index.js +52 -0
  760. package/vendor/ink/node_modules/node-pty/lib/interfaces.js +7 -0
  761. package/vendor/ink/node_modules/node-pty/lib/shared/conout.js +11 -0
  762. package/vendor/ink/node_modules/node-pty/lib/terminal.js +190 -0
  763. package/vendor/ink/node_modules/node-pty/lib/types.js +7 -0
  764. package/vendor/ink/node_modules/node-pty/lib/unixTerminal.js +349 -0
  765. package/vendor/ink/node_modules/node-pty/lib/utils.js +39 -0
  766. package/vendor/ink/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
  767. package/vendor/ink/node_modules/node-pty/lib/windowsPtyAgent.js +287 -0
  768. package/vendor/ink/node_modules/node-pty/lib/windowsTerminal.js +201 -0
  769. package/vendor/ink/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  770. package/vendor/ink/node_modules/node-pty/package.json +65 -0
  771. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
  772. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
  773. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
  774. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
  775. package/vendor/ink/node_modules/node-pty/prebuilds/linux-arm64/pty.node +0 -0
  776. package/vendor/ink/node_modules/node-pty/prebuilds/linux-x64/pty.node +0 -0
  777. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  778. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  779. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  780. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
  781. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  782. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  783. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  784. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  785. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  786. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
  787. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  788. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  789. package/vendor/ink/node_modules/node-pty/scripts/post-install.js +76 -0
  790. package/vendor/ink/node_modules/node-pty/scripts/prebuild.js +34 -0
  791. package/vendor/ink/node_modules/node-pty/src/unix/pty.cc +875 -0
  792. package/vendor/ink/node_modules/node-pty/src/unix/spawn-helper.cc +23 -0
  793. package/vendor/ink/node_modules/node-pty/src/win/conpty.cc +582 -0
  794. package/vendor/ink/node_modules/node-pty/src/win/conpty.h +41 -0
  795. package/vendor/ink/node_modules/node-pty/src/win/conpty_console_list.cc +44 -0
  796. package/vendor/ink/node_modules/node-pty/src/win/path_util.cc +95 -0
  797. package/vendor/ink/node_modules/node-pty/src/win/path_util.h +26 -0
  798. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
  799. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
  800. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
  801. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
  802. package/vendor/ink/node_modules/node-pty/typings/node-pty.d.ts +215 -0
  803. package/vendor/ink/node_modules/undici-types/LICENSE +21 -0
  804. package/vendor/ink/node_modules/undici-types/README.md +6 -0
  805. package/vendor/ink/node_modules/undici-types/agent.d.ts +32 -0
  806. package/vendor/ink/node_modules/undici-types/api.d.ts +43 -0
  807. package/vendor/ink/node_modules/undici-types/balanced-pool.d.ts +30 -0
  808. package/vendor/ink/node_modules/undici-types/cache-interceptor.d.ts +173 -0
  809. package/vendor/ink/node_modules/undici-types/cache.d.ts +36 -0
  810. package/vendor/ink/node_modules/undici-types/client-stats.d.ts +15 -0
  811. package/vendor/ink/node_modules/undici-types/client.d.ts +108 -0
  812. package/vendor/ink/node_modules/undici-types/connector.d.ts +34 -0
  813. package/vendor/ink/node_modules/undici-types/content-type.d.ts +21 -0
  814. package/vendor/ink/node_modules/undici-types/cookies.d.ts +30 -0
  815. package/vendor/ink/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
  816. package/vendor/ink/node_modules/undici-types/dispatcher.d.ts +276 -0
  817. package/vendor/ink/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
  818. package/vendor/ink/node_modules/undici-types/errors.d.ts +161 -0
  819. package/vendor/ink/node_modules/undici-types/eventsource.d.ts +66 -0
  820. package/vendor/ink/node_modules/undici-types/fetch.d.ts +211 -0
  821. package/vendor/ink/node_modules/undici-types/formdata.d.ts +108 -0
  822. package/vendor/ink/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  823. package/vendor/ink/node_modules/undici-types/global-origin.d.ts +7 -0
  824. package/vendor/ink/node_modules/undici-types/h2c-client.d.ts +73 -0
  825. package/vendor/ink/node_modules/undici-types/handlers.d.ts +15 -0
  826. package/vendor/ink/node_modules/undici-types/header.d.ts +160 -0
  827. package/vendor/ink/node_modules/undici-types/index.d.ts +88 -0
  828. package/vendor/ink/node_modules/undici-types/interceptors.d.ts +73 -0
  829. package/vendor/ink/node_modules/undici-types/mock-agent.d.ts +68 -0
  830. package/vendor/ink/node_modules/undici-types/mock-call-history.d.ts +111 -0
  831. package/vendor/ink/node_modules/undici-types/mock-client.d.ts +27 -0
  832. package/vendor/ink/node_modules/undici-types/mock-errors.d.ts +12 -0
  833. package/vendor/ink/node_modules/undici-types/mock-interceptor.d.ts +94 -0
  834. package/vendor/ink/node_modules/undici-types/mock-pool.d.ts +27 -0
  835. package/vendor/ink/node_modules/undici-types/package.json +55 -0
  836. package/vendor/ink/node_modules/undici-types/patch.d.ts +29 -0
  837. package/vendor/ink/node_modules/undici-types/pool-stats.d.ts +19 -0
  838. package/vendor/ink/node_modules/undici-types/pool.d.ts +41 -0
  839. package/vendor/ink/node_modules/undici-types/proxy-agent.d.ts +29 -0
  840. package/vendor/ink/node_modules/undici-types/readable.d.ts +68 -0
  841. package/vendor/ink/node_modules/undici-types/retry-agent.d.ts +8 -0
  842. package/vendor/ink/node_modules/undici-types/retry-handler.d.ts +125 -0
  843. package/vendor/ink/node_modules/undici-types/round-robin-pool.d.ts +41 -0
  844. package/vendor/ink/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  845. package/vendor/ink/node_modules/undici-types/util.d.ts +18 -0
  846. package/vendor/ink/node_modules/undici-types/utility.d.ts +7 -0
  847. package/vendor/ink/node_modules/undici-types/webidl.d.ts +341 -0
  848. package/vendor/ink/node_modules/undici-types/websocket.d.ts +186 -0
  849. package/vendor/ink/package.json +201 -0
  850. package/vendor/ink/readme.md +2636 -0
  851. package/bin/swag-agent.js +0 -9
  852. package/dist/server/lib/pg-rate-limiter.d.ts +0 -21
  853. package/dist/server/lib/pg-rate-limiter.js +0 -86
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * Extracted from local-tools.ts for single-responsibility.
5
5
  */
6
+
6
7
  import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, statSync } from "fs";
7
8
  import { dirname, join } from "path";
8
9
  import { execSync } from "child_process";
@@ -11,333 +12,456 @@ import { backupFile } from "../file-history.js";
11
12
  import { notifyFileChanged } from "../lsp-manager.js";
12
13
  import { debugLog } from "../debug-log.js";
13
14
  export function resolvePath(p) {
14
- if (p.startsWith("~/"))
15
- return join(homedir(), p.slice(2));
16
- return p;
15
+ if (p.startsWith("~/")) return join(homedir(), p.slice(2));
16
+ return p;
17
17
  }
18
+
19
+ // ============================================================================
20
+ // FILE READ CACHE — mtime-based, LRU eviction, session-scoped
21
+ // ============================================================================
22
+
18
23
  const READ_CACHE_MAX = 100;
19
24
  const MAX_ENTRY_SIZE = 100_000; // 100KB — skip caching larger files
20
25
  const MAX_CACHE_BYTES = 10_000_000; // 10MB total budget
21
26
  let totalCacheBytes = 0;
22
27
  const readCache = new Map();
28
+
23
29
  /** Clear the session-level read cache. Call on session reset. */
24
30
  export function clearReadCache() {
25
- readCache.clear();
26
- totalCacheBytes = 0;
31
+ readCache.clear();
32
+ totalCacheBytes = 0;
27
33
  }
34
+
28
35
  /** Invalidate a specific path from the cache (call on write/edit). */
29
36
  function invalidateCache(path) {
30
- const existing = readCache.get(path);
31
- if (existing) {
32
- totalCacheBytes -= existing.content.length;
33
- readCache.delete(path);
34
- }
37
+ const existing = readCache.get(path);
38
+ if (existing) {
39
+ totalCacheBytes -= existing.content.length;
40
+ readCache.delete(path);
41
+ }
35
42
  }
43
+
36
44
  /** LRU eviction: remove oldest entries when cache exceeds count or byte budget. */
37
45
  function evictIfNeeded() {
38
- while (readCache.size >= READ_CACHE_MAX || totalCacheBytes > MAX_CACHE_BYTES) {
39
- const oldest = readCache.keys().next().value;
40
- if (!oldest)
41
- break;
42
- const entry = readCache.get(oldest);
43
- if (entry)
44
- totalCacheBytes -= entry.content.length;
45
- readCache.delete(oldest);
46
- }
46
+ while (readCache.size >= READ_CACHE_MAX || totalCacheBytes > MAX_CACHE_BYTES) {
47
+ const oldest = readCache.keys().next().value;
48
+ if (!oldest) break;
49
+ const entry = readCache.get(oldest);
50
+ if (entry) totalCacheBytes -= entry.content.length;
51
+ readCache.delete(oldest);
52
+ }
47
53
  }
54
+
48
55
  // ============================================================================
49
56
  // READ FILE
50
57
  // ============================================================================
58
+
51
59
  const IMAGE_EXTENSIONS = new Set(["png", "jpg", "jpeg", "gif", "webp"]);
52
60
  const IMAGE_MEDIA_TYPES = {
53
- png: "image/png", jpg: "image/jpeg", jpeg: "image/jpeg",
54
- gif: "image/gif", webp: "image/webp",
61
+ png: "image/png",
62
+ jpg: "image/jpeg",
63
+ jpeg: "image/jpeg",
64
+ gif: "image/gif",
65
+ webp: "image/webp"
55
66
  };
56
67
  const AUDIO_EXTENSIONS = new Set(["mp3", "wav", "aiff", "aac", "ogg", "flac", "m4a"]);
57
68
  const AUDIO_MEDIA_TYPES = {
58
- mp3: "audio/mpeg", wav: "audio/wav", aiff: "audio/aiff",
59
- aac: "audio/aac", ogg: "audio/ogg", flac: "audio/flac",
60
- m4a: "audio/mp4",
69
+ mp3: "audio/mpeg",
70
+ wav: "audio/wav",
71
+ aiff: "audio/aiff",
72
+ aac: "audio/aac",
73
+ ogg: "audio/ogg",
74
+ flac: "audio/flac",
75
+ m4a: "audio/mp4"
61
76
  };
62
77
  const AUDIO_MAX_SIZE = 25 * 1024 * 1024; // 25MB
78
+
63
79
  function formatTextFileResult(lines, input, content) {
64
- const offset = input.offset || 1; // 1-based
65
- const limit = input.limit;
66
- if (offset > 1 || limit) {
67
- const startIdx = Math.max(0, offset - 1);
68
- const endIdx = limit ? startIdx + limit : lines.length;
69
- const slice = lines.slice(startIdx, endIdx);
70
- const numbered = slice.map((line, i) => {
71
- const lineNum = startIdx + i + 1;
72
- return `${String(lineNum).padStart(6)} ${line}`;
73
- });
74
- let output = numbered.join("\n");
75
- if (endIdx < lines.length) {
76
- output += `\n\n... (showing lines ${startIdx + 1}-${Math.min(endIdx, lines.length)} of ${lines.length})`;
77
- }
78
- return { success: true, output };
79
- }
80
- if (content.length > 500_000) {
81
- return { success: true, output: content.slice(0, 500_000) + `\n\n... (safety truncated, ${content.length.toLocaleString()} total chars)` };
80
+ const offset = input.offset || 1; // 1-based
81
+ const limit = input.limit;
82
+ if (offset > 1 || limit) {
83
+ const startIdx = Math.max(0, offset - 1);
84
+ const endIdx = limit ? startIdx + limit : lines.length;
85
+ const slice = lines.slice(startIdx, endIdx);
86
+ const numbered = slice.map((line, i) => {
87
+ const lineNum = startIdx + i + 1;
88
+ return `${String(lineNum).padStart(6)} ${line}`;
89
+ });
90
+ let output = numbered.join("\n");
91
+ if (endIdx < lines.length) {
92
+ output += `\n\n... (showing lines ${startIdx + 1}-${Math.min(endIdx, lines.length)} of ${lines.length})`;
82
93
  }
83
- return { success: true, output: content };
94
+ return {
95
+ success: true,
96
+ output
97
+ };
98
+ }
99
+ if (content.length > 500_000) {
100
+ return {
101
+ success: true,
102
+ output: content.slice(0, 500_000) + `\n\n... (safety truncated, ${content.length.toLocaleString()} total chars)`
103
+ };
104
+ }
105
+ return {
106
+ success: true,
107
+ output: content
108
+ };
84
109
  }
85
110
  export async function readFile(input) {
86
- const path = resolvePath(input.path);
87
- if (!existsSync(path))
88
- return { success: false, output: `File not found: ${path}` };
89
- const ext = path.split(".").pop()?.toLowerCase() || "";
90
- // Image files -> base64 with marker for agent-loop to convert to image content block
91
- if (IMAGE_EXTENSIONS.has(ext)) {
92
- try {
93
- const buffer = readFileSync(path);
94
- const base64 = buffer.toString("base64");
95
- const mediaType = IMAGE_MEDIA_TYPES[ext] || "image/png";
96
- return { success: true, output: `__IMAGE__${mediaType}__${base64}` };
97
- }
98
- catch (err) {
99
- return { success: false, output: `Failed to read image: ${err}` };
100
- }
101
- }
102
- // Audio files -> base64 with marker for agent-loop to convert to audio content block
103
- if (AUDIO_EXTENSIONS.has(ext)) {
104
- try {
105
- const stat = statSync(path);
106
- if (stat.size > AUDIO_MAX_SIZE) {
107
- return { success: false, output: `Audio file too large: ${(stat.size / 1024 / 1024).toFixed(1)}MB (max 25MB)` };
108
- }
109
- const buffer = readFileSync(path);
110
- const base64 = buffer.toString("base64");
111
- const mediaType = AUDIO_MEDIA_TYPES[ext] || "audio/mpeg";
112
- return { success: true, output: `__AUDIO__${mediaType}__${base64}` };
113
- }
114
- catch (err) {
115
- return { success: false, output: `Failed to read audio file: ${err}` };
116
- }
111
+ const path = resolvePath(input.path);
112
+ if (!existsSync(path)) return {
113
+ success: false,
114
+ output: `File not found: ${path}`
115
+ };
116
+ const ext = path.split(".").pop()?.toLowerCase() || "";
117
+
118
+ // Image files -> base64 with marker for agent-loop to convert to image content block
119
+ if (IMAGE_EXTENSIONS.has(ext)) {
120
+ try {
121
+ const buffer = readFileSync(path);
122
+ const base64 = buffer.toString("base64");
123
+ const mediaType = IMAGE_MEDIA_TYPES[ext] || "image/png";
124
+ return {
125
+ success: true,
126
+ output: `__IMAGE__${mediaType}__${base64}`
127
+ };
128
+ } catch (err) {
129
+ return {
130
+ success: false,
131
+ output: `Failed to read image: ${err}`
132
+ };
117
133
  }
118
- // PDF files -> extract text
119
- if (ext === "pdf") {
120
- try {
121
- const pdfParse = (await import("pdf-parse")).default;
122
- const buffer = readFileSync(path);
123
- const data = await pdfParse(buffer);
124
- let text = data.text || "";
125
- const totalPages = data.numpages || 0;
126
- const pagesParam = input.pages;
127
- // Apply page range filter if specified
128
- if (pagesParam && text) {
129
- const pageTexts = text.split(/\f/); // Form feed splits pages in most PDFs
130
- const { start, end } = parsePageRange(pagesParam, pageTexts.length);
131
- text = pageTexts.slice(start, end).join("\n\n---\n\n");
132
- }
133
- if (text.length > 500_000) {
134
- text = text.slice(0, 500_000) + `\n\n... (safety truncated — ${text.length.toLocaleString()} chars total)`;
135
- }
136
- return {
137
- success: true,
138
- output: `PDF: ${path} (${totalPages} pages)\n\n${text}`,
139
- };
140
- }
141
- catch (err) {
142
- return { success: false, output: `Failed to parse PDF: ${err}` };
143
- }
134
+ }
135
+
136
+ // Audio files -> base64 with marker for agent-loop to convert to audio content block
137
+ if (AUDIO_EXTENSIONS.has(ext)) {
138
+ try {
139
+ const stat = statSync(path);
140
+ if (stat.size > AUDIO_MAX_SIZE) {
141
+ return {
142
+ success: false,
143
+ output: `Audio file too large: ${(stat.size / 1024 / 1024).toFixed(1)}MB (max 25MB)`
144
+ };
145
+ }
146
+ const buffer = readFileSync(path);
147
+ const base64 = buffer.toString("base64");
148
+ const mediaType = AUDIO_MEDIA_TYPES[ext] || "audio/mpeg";
149
+ return {
150
+ success: true,
151
+ output: `__AUDIO__${mediaType}__${base64}`
152
+ };
153
+ } catch (err) {
154
+ return {
155
+ success: false,
156
+ output: `Failed to read audio file: ${err}`
157
+ };
144
158
  }
145
- // Text files — check cache first via mtime comparison
159
+ }
160
+
161
+ // PDF files -> extract text
162
+ if (ext === "pdf") {
146
163
  try {
147
- const stat = statSync(path);
148
- const cached = readCache.get(path);
149
- if (cached && cached.mtimeMs === stat.mtimeMs && cached.size === stat.size) {
150
- // Cache hit use previously read content
151
- debugLog("file-ops", `readFile cache hit: ${path}`);
152
- const content = cached.content;
153
- const lines = content.split("\n");
154
- // Move to end of map for LRU freshness
155
- readCache.delete(path);
156
- readCache.set(path, cached);
157
- return formatTextFileResult(lines, input, content);
158
- }
164
+ const pdfParse = (await import("pdf-parse")).default;
165
+ const buffer = readFileSync(path);
166
+ const data = await pdfParse(buffer);
167
+ let text = data.text || "";
168
+ const totalPages = data.numpages || 0;
169
+ const pagesParam = input.pages;
170
+
171
+ // Apply page range filter if specified
172
+ if (pagesParam && text) {
173
+ const pageTexts = text.split(/\f/); // Form feed splits pages in most PDFs
174
+ const {
175
+ start,
176
+ end
177
+ } = parsePageRange(pagesParam, pageTexts.length);
178
+ text = pageTexts.slice(start, end).join("\n\n---\n\n");
179
+ }
180
+ if (text.length > 500_000) {
181
+ text = text.slice(0, 500_000) + `\n\n... (safety truncated — ${text.length.toLocaleString()} chars total)`;
182
+ }
183
+ return {
184
+ success: true,
185
+ output: `PDF: ${path} (${totalPages} pages)\n\n${text}`
186
+ };
187
+ } catch (err) {
188
+ return {
189
+ success: false,
190
+ output: `Failed to parse PDF: ${err}`
191
+ };
159
192
  }
160
- catch {
161
- // stat failed — fall through to normal read
193
+ }
194
+
195
+ // Text files — check cache first via mtime comparison
196
+ try {
197
+ const stat = statSync(path);
198
+ const cached = readCache.get(path);
199
+ if (cached && cached.mtimeMs === stat.mtimeMs && cached.size === stat.size) {
200
+ // Cache hit — use previously read content
201
+ debugLog("file-ops", `readFile cache hit: ${path}`);
202
+ const content = cached.content;
203
+ const lines = content.split("\n");
204
+ // Move to end of map for LRU freshness
205
+ readCache.delete(path);
206
+ readCache.set(path, cached);
207
+ return formatTextFileResult(lines, input, content);
162
208
  }
163
- const content = readFileSync(path, "utf-8");
164
- const lines = content.split("\n");
165
- // Cache the read — skip caching files larger than MAX_ENTRY_SIZE
166
- if (content.length <= MAX_ENTRY_SIZE) {
167
- try {
168
- const stat = statSync(path);
169
- evictIfNeeded();
170
- readCache.set(path, { content, mtimeMs: stat.mtimeMs, size: stat.size });
171
- totalCacheBytes += content.length;
172
- }
173
- catch {
174
- // stat failed — skip caching
175
- }
209
+ } catch {
210
+ // stat failed — fall through to normal read
211
+ }
212
+ const content = readFileSync(path, "utf-8");
213
+ const lines = content.split("\n");
214
+
215
+ // Cache the read — skip caching files larger than MAX_ENTRY_SIZE
216
+ if (content.length <= MAX_ENTRY_SIZE) {
217
+ try {
218
+ const stat = statSync(path);
219
+ evictIfNeeded();
220
+ readCache.set(path, {
221
+ content,
222
+ mtimeMs: stat.mtimeMs,
223
+ size: stat.size
224
+ });
225
+ totalCacheBytes += content.length;
226
+ } catch {
227
+ // stat failed — skip caching
176
228
  }
177
- return formatTextFileResult(lines, input, content);
229
+ }
230
+ return formatTextFileResult(lines, input, content);
178
231
  }
179
232
  function parsePageRange(range, totalPages) {
180
- const parts = range.split("-");
181
- const start = Math.max(0, parseInt(parts[0], 10) - 1);
182
- const end = parts.length > 1 ? Math.min(totalPages, parseInt(parts[1], 10)) : start + 1;
183
- return { start, end };
233
+ const parts = range.split("-");
234
+ const start = Math.max(0, parseInt(parts[0], 10) - 1);
235
+ const end = parts.length > 1 ? Math.min(totalPages, parseInt(parts[1], 10)) : start + 1;
236
+ return {
237
+ start,
238
+ end
239
+ };
184
240
  }
241
+
185
242
  // ============================================================================
186
243
  // WRITE FILE
187
244
  // ============================================================================
245
+
188
246
  /** Compute a unified diff between old and new file lines using prefix/suffix matching */
189
247
  function computeWriteDiff(oldLines, newLines) {
190
- const CTX = 3;
191
- const MAX_PER_SIDE = 60;
192
- // Find common prefix
193
- let prefixLen = 0;
194
- while (prefixLen < oldLines.length && prefixLen < newLines.length &&
195
- oldLines[prefixLen] === newLines[prefixLen]) {
196
- prefixLen++;
197
- }
198
- // Find common suffix (not overlapping prefix)
199
- let suffixLen = 0;
200
- while (suffixLen < (oldLines.length - prefixLen) &&
201
- suffixLen < (newLines.length - prefixLen) &&
202
- oldLines[oldLines.length - 1 - suffixLen] === newLines[newLines.length - 1 - suffixLen]) {
203
- suffixLen++;
204
- }
205
- // If identical
206
- if (prefixLen + suffixLen >= oldLines.length && prefixLen + suffixLen >= newLines.length) {
207
- return []; // no changes
208
- }
209
- const oldMiddle = oldLines.slice(prefixLen, oldLines.length - suffixLen);
210
- const newMiddle = newLines.slice(prefixLen, newLines.length - suffixLen);
211
- // If most of the file changed, show a compact summary
212
- if (oldMiddle.length > MAX_PER_SIDE * 2 && newMiddle.length > MAX_PER_SIDE * 2) {
213
- const showOld = oldMiddle.slice(0, MAX_PER_SIDE);
214
- const showNew = newMiddle.slice(0, MAX_PER_SIDE);
215
- const ctxStart = Math.max(0, prefixLen - CTX);
216
- const ctxBefore = oldLines.slice(ctxStart, prefixLen);
217
- const parts = [`@@ -${ctxStart + 1},${ctxBefore.length + showOld.length} +${ctxStart + 1},${ctxBefore.length + showNew.length} @@`];
218
- for (const l of ctxBefore)
219
- parts.push(` ${l}`);
220
- for (const l of showOld)
221
- parts.push(`-${l}`);
222
- parts.push(`-... (${oldMiddle.length - MAX_PER_SIDE} more lines removed)`);
223
- for (const l of showNew)
224
- parts.push(`+${l}`);
225
- parts.push(`+... (${newMiddle.length - MAX_PER_SIDE} more lines added)`);
226
- return parts;
227
- }
228
- // Build single hunk with context
248
+ const CTX = 3;
249
+ const MAX_PER_SIDE = 60;
250
+
251
+ // Find common prefix
252
+ let prefixLen = 0;
253
+ while (prefixLen < oldLines.length && prefixLen < newLines.length && oldLines[prefixLen] === newLines[prefixLen]) {
254
+ prefixLen++;
255
+ }
256
+
257
+ // Find common suffix (not overlapping prefix)
258
+ let suffixLen = 0;
259
+ while (suffixLen < oldLines.length - prefixLen && suffixLen < newLines.length - prefixLen && oldLines[oldLines.length - 1 - suffixLen] === newLines[newLines.length - 1 - suffixLen]) {
260
+ suffixLen++;
261
+ }
262
+
263
+ // If identical
264
+ if (prefixLen + suffixLen >= oldLines.length && prefixLen + suffixLen >= newLines.length) {
265
+ return []; // no changes
266
+ }
267
+ const oldMiddle = oldLines.slice(prefixLen, oldLines.length - suffixLen);
268
+ const newMiddle = newLines.slice(prefixLen, newLines.length - suffixLen);
269
+
270
+ // If most of the file changed, show a compact summary
271
+ if (oldMiddle.length > MAX_PER_SIDE * 2 && newMiddle.length > MAX_PER_SIDE * 2) {
272
+ const showOld = oldMiddle.slice(0, MAX_PER_SIDE);
273
+ const showNew = newMiddle.slice(0, MAX_PER_SIDE);
229
274
  const ctxStart = Math.max(0, prefixLen - CTX);
230
275
  const ctxBefore = oldLines.slice(ctxStart, prefixLen);
231
- const newSuffixStart = newLines.length - suffixLen;
232
- const ctxAfter = newLines.slice(newSuffixStart, Math.min(newSuffixStart + CTX, newLines.length));
233
- const hunkOldLen = ctxBefore.length + oldMiddle.length + ctxAfter.length;
234
- const hunkNewLen = ctxBefore.length + newMiddle.length + ctxAfter.length;
235
- const parts = [`@@ -${ctxStart + 1},${hunkOldLen} +${ctxStart + 1},${hunkNewLen} @@`];
236
- for (const l of ctxBefore)
237
- parts.push(` ${l}`);
238
- for (const l of oldMiddle.slice(0, MAX_PER_SIDE))
239
- parts.push(`-${l}`);
240
- if (oldMiddle.length > MAX_PER_SIDE)
241
- parts.push(`-... (${oldMiddle.length - MAX_PER_SIDE} more lines removed)`);
242
- for (const l of newMiddle.slice(0, MAX_PER_SIDE))
243
- parts.push(`+${l}`);
244
- if (newMiddle.length > MAX_PER_SIDE)
245
- parts.push(`+... (${newMiddle.length - MAX_PER_SIDE} more lines added)`);
246
- for (const l of ctxAfter)
247
- parts.push(` ${l}`);
276
+ const parts = [`@@ -${ctxStart + 1},${ctxBefore.length + showOld.length} +${ctxStart + 1},${ctxBefore.length + showNew.length} @@`];
277
+ for (const l of ctxBefore) parts.push(` ${l}`);
278
+ for (const l of showOld) parts.push(`-${l}`);
279
+ parts.push(`-... (${oldMiddle.length - MAX_PER_SIDE} more lines removed)`);
280
+ for (const l of showNew) parts.push(`+${l}`);
281
+ parts.push(`+... (${newMiddle.length - MAX_PER_SIDE} more lines added)`);
248
282
  return parts;
283
+ }
284
+
285
+ // Build single hunk with context
286
+ const ctxStart = Math.max(0, prefixLen - CTX);
287
+ const ctxBefore = oldLines.slice(ctxStart, prefixLen);
288
+ const newSuffixStart = newLines.length - suffixLen;
289
+ const ctxAfter = newLines.slice(newSuffixStart, Math.min(newSuffixStart + CTX, newLines.length));
290
+ const hunkOldLen = ctxBefore.length + oldMiddle.length + ctxAfter.length;
291
+ const hunkNewLen = ctxBefore.length + newMiddle.length + ctxAfter.length;
292
+ const parts = [`@@ -${ctxStart + 1},${hunkOldLen} +${ctxStart + 1},${hunkNewLen} @@`];
293
+ for (const l of ctxBefore) parts.push(` ${l}`);
294
+ for (const l of oldMiddle.slice(0, MAX_PER_SIDE)) parts.push(`-${l}`);
295
+ if (oldMiddle.length > MAX_PER_SIDE) parts.push(`-... (${oldMiddle.length - MAX_PER_SIDE} more lines removed)`);
296
+ for (const l of newMiddle.slice(0, MAX_PER_SIDE)) parts.push(`+${l}`);
297
+ if (newMiddle.length > MAX_PER_SIDE) parts.push(`+... (${newMiddle.length - MAX_PER_SIDE} more lines added)`);
298
+ for (const l of ctxAfter) parts.push(` ${l}`);
299
+ return parts;
249
300
  }
250
301
  export function writeFile(input) {
251
- const path = resolvePath(input.path);
252
- const content = input.content;
253
- invalidateCache(path); // Invalidate read cache before write
254
- const existed = existsSync(path);
255
- const oldContent = existed ? readFileSync(path, "utf-8") : null;
256
- backupFile(path); // Save backup before modification
257
- const dir = dirname(path);
258
- if (!existsSync(dir))
259
- mkdirSync(dir, { recursive: true });
260
- writeFileSync(path, content, "utf-8");
261
- debugLog("tools", `write_file: ${path} (${content.length} chars)`);
262
- notifyFileChanged(path);
263
- const newLines = content.split("\n");
264
- if (!existed || !oldContent) {
265
- // New file show as all-added unified diff
266
- const previewMax = 30;
267
- const preview = newLines.slice(0, previewMax).map(l => `+${l}`);
268
- if (newLines.length > previewMax)
269
- preview.push(`+... (+${newLines.length - previewMax} more lines)`);
270
- return {
271
- success: true,
272
- output: `Created: ${path} (${newLines.length} lines, ${content.length} chars)\n@@ -0,0 +1,${Math.min(newLines.length, previewMax)} @@\n${preview.join("\n")}`,
273
- };
274
- }
275
- // Overwrite — compute diff between old and new content
276
- const oldLines = oldContent.split("\n");
277
- const diff = computeWriteDiff(oldLines, newLines);
278
- // Count changes
279
- let added = 0, removed = 0;
280
- for (const line of diff) {
281
- if (line.startsWith("+"))
282
- added++;
283
- else if (line.startsWith("-"))
284
- removed++;
285
- }
286
- const summary = `Added ${added} lines, removed ${removed} lines`;
302
+ const path = resolvePath(input.path);
303
+ const content = input.content;
304
+ invalidateCache(path); // Invalidate read cache before write
305
+ const existed = existsSync(path);
306
+ const oldContent = existed ? readFileSync(path, "utf-8") : null;
307
+ backupFile(path); // Save backup before modification
308
+ const dir = dirname(path);
309
+ if (!existsSync(dir)) mkdirSync(dir, {
310
+ recursive: true
311
+ });
312
+ writeFileSync(path, content, "utf-8");
313
+ debugLog("tools", `write_file: ${path} (${content.length} chars)`);
314
+ notifyFileChanged(path);
315
+ const newLines = content.split("\n");
316
+ if (!existed || !oldContent) {
317
+ // New file — show as all-added unified diff
318
+ const previewMax = 30;
319
+ const preview = newLines.slice(0, previewMax).map(l => `+${l}`);
320
+ if (newLines.length > previewMax) preview.push(`+... (+${newLines.length - previewMax} more lines)`);
287
321
  return {
288
- success: true,
289
- output: `Updated: ${path} (${summary})\n${diff.join("\n")}`,
322
+ success: true,
323
+ output: `Created: ${path} (${newLines.length} lines, ${content.length} chars)\n@@ -0,0 +1,${Math.min(newLines.length, previewMax)} @@\n${preview.join("\n")}`
290
324
  };
325
+ }
326
+
327
+ // Overwrite — compute diff between old and new content
328
+ const oldLines = oldContent.split("\n");
329
+ const diff = computeWriteDiff(oldLines, newLines);
330
+
331
+ // Count changes
332
+ let added = 0,
333
+ removed = 0;
334
+ for (const line of diff) {
335
+ if (line.startsWith("+")) added++;else if (line.startsWith("-")) removed++;
336
+ }
337
+ const summary = `Added ${added} lines, removed ${removed} lines`;
338
+ return {
339
+ success: true,
340
+ output: `Updated: ${path} (${summary})\n${diff.join("\n")}`
341
+ };
291
342
  }
343
+
292
344
  // ============================================================================
293
345
  // EDIT FILE
294
346
  // ============================================================================
347
+
295
348
  export function editFile(input) {
296
- const path = resolvePath(input.path);
297
- const oldString = input.old_string;
298
- const newString = input.new_string;
299
- const replaceAll = input.replace_all ?? false;
300
- if (!existsSync(path))
301
- return { success: false, output: `File not found: ${path}` };
302
- invalidateCache(path); // Invalidate read cache before edit
303
- backupFile(path); // Save backup before modification
304
- let content = readFileSync(path, "utf-8");
305
- if (!content.includes(oldString))
306
- return { success: false, output: "old_string not found in file" };
307
- if (replaceAll) {
308
- let count = 0;
309
- if (newString.includes(oldString)) {
310
- // Avoid infinite loop: use split-join for safe replacement
311
- const parts = content.split(oldString);
312
- count = parts.length - 1;
313
- content = parts.join(newString);
314
- }
315
- else {
316
- while (content.includes(oldString)) {
317
- content = content.replace(oldString, newString);
318
- count++;
319
- if (count > 10000)
320
- break; // safety
321
- }
322
- }
323
- writeFileSync(path, content, "utf-8");
324
- notifyFileChanged(path);
325
- return { success: true, output: `File edited: ${path} (${count} replacements)` };
349
+ const path = resolvePath(input.path);
350
+ const oldString = input.old_string;
351
+ const newString = input.new_string;
352
+ const replaceAll = input.replace_all ?? false;
353
+ if (!existsSync(path)) return {
354
+ success: false,
355
+ output: `File not found: ${path}`
356
+ };
357
+ invalidateCache(path); // Invalidate read cache before edit
358
+ backupFile(path); // Save backup before modification
359
+ let content = readFileSync(path, "utf-8");
360
+ if (!content.includes(oldString)) return {
361
+ success: false,
362
+ output: "old_string not found in file"
363
+ };
364
+ if (replaceAll) {
365
+ let count = 0;
366
+ if (newString.includes(oldString)) {
367
+ // Avoid infinite loop: use split-join for safe replacement
368
+ const parts = content.split(oldString);
369
+ count = parts.length - 1;
370
+ content = parts.join(newString);
371
+ } else {
372
+ while (content.includes(oldString)) {
373
+ content = content.replace(oldString, newString);
374
+ count++;
375
+ if (count > 10000) break; // safety
376
+ }
326
377
  }
327
- // Single replacement (original behavior)
328
- const idx = content.indexOf(oldString);
329
- const newContent = content.slice(0, idx) + newString + content.slice(idx + oldString.length);
330
- writeFileSync(path, newContent, "utf-8");
378
+ writeFileSync(path, content, "utf-8");
331
379
  notifyFileChanged(path);
332
- // Generate unified diff with context and line numbers
380
+ return {
381
+ success: true,
382
+ output: `File edited: ${path} (${count} replacements)`
383
+ };
384
+ }
385
+
386
+ // Single replacement (original behavior)
387
+ const idx = content.indexOf(oldString);
388
+ const newContent = content.slice(0, idx) + newString + content.slice(idx + oldString.length);
389
+ writeFileSync(path, newContent, "utf-8");
390
+ notifyFileChanged(path);
391
+
392
+ // Generate unified diff with context and line numbers
393
+ const allOldLines = content.split("\n");
394
+ const allNewLines = newContent.split("\n");
395
+ const beforeEdit = content.slice(0, idx);
396
+ const startLine = beforeEdit.split("\n").length; // 1-based
397
+ const oldLines = oldString.split("\n");
398
+ const newLines = newString.split("\n");
399
+ const CTX = 3;
400
+ const MAX_LINES = 20;
401
+ const ctxStart = Math.max(1, startLine - CTX);
402
+ const ctxBeforeLines = allOldLines.slice(ctxStart - 1, startLine - 1);
403
+ const newEndLine = startLine + newLines.length - 1;
404
+ const ctxAfterLines = allNewLines.slice(newEndLine, Math.min(newEndLine + CTX, allNewLines.length));
405
+ const showOld = oldLines.slice(0, MAX_LINES);
406
+ const showNew = newLines.slice(0, MAX_LINES);
407
+ const hunkOldLen = ctxBeforeLines.length + showOld.length + ctxAfterLines.length;
408
+ const hunkNewLen = ctxBeforeLines.length + showNew.length + ctxAfterLines.length;
409
+ const diffParts = [];
410
+ diffParts.push(`@@ -${ctxStart},${hunkOldLen} +${ctxStart},${hunkNewLen} @@`);
411
+ for (const l of ctxBeforeLines) diffParts.push(` ${l}`);
412
+ for (const l of showOld) diffParts.push(`-${l}`);
413
+ if (oldLines.length > MAX_LINES) diffParts.push(`-... (${oldLines.length - MAX_LINES} more lines)`);
414
+ for (const l of showNew) diffParts.push(`+${l}`);
415
+ if (newLines.length > MAX_LINES) diffParts.push(`+... (${newLines.length - MAX_LINES} more lines)`);
416
+ for (const l of ctxAfterLines) diffParts.push(` ${l}`);
417
+ return {
418
+ success: true,
419
+ output: `File edited: ${path}\n${diffParts.join("\n")}`
420
+ };
421
+ }
422
+
423
+ // ============================================================================
424
+ // MULTI EDIT
425
+ // ============================================================================
426
+
427
+ export function multiEdit(input) {
428
+ const path = resolvePath(input.file_path);
429
+ const edits = input.edits;
430
+ if (!existsSync(path)) return {
431
+ success: false,
432
+ output: `File not found: ${path}`
433
+ };
434
+ if (!Array.isArray(edits) || edits.length === 0) return {
435
+ success: false,
436
+ output: "edits array is required and must not be empty"
437
+ };
438
+ invalidateCache(path); // Invalidate read cache before edit
439
+ backupFile(path); // Save backup before modification
440
+ let content = readFileSync(path, "utf-8");
441
+ const diffParts = [];
442
+ const CTX = 2;
443
+ const MAX_LINES = 10;
444
+ for (let i = 0; i < edits.length; i++) {
445
+ const {
446
+ old_string,
447
+ new_string
448
+ } = edits[i];
449
+ const idx = content.indexOf(old_string);
450
+ if (idx === -1) {
451
+ return {
452
+ success: false,
453
+ output: `Edit ${i + 1}/${edits.length} failed: old_string not found (${i} edits applied successfully before failure)`
454
+ };
455
+ }
456
+
457
+ // Compute line numbers before applying edit
333
458
  const allOldLines = content.split("\n");
334
- const allNewLines = newContent.split("\n");
335
459
  const beforeEdit = content.slice(0, idx);
336
- const startLine = beforeEdit.split("\n").length; // 1-based
337
- const oldLines = oldString.split("\n");
338
- const newLines = newString.split("\n");
339
- const CTX = 3;
340
- const MAX_LINES = 20;
460
+ const startLine = beforeEdit.split("\n").length;
461
+ const oldLines = old_string.split("\n");
462
+ const newLines = new_string.split("\n");
463
+ const newContent = content.slice(0, idx) + new_string + content.slice(idx + old_string.length);
464
+ const allNewLines = newContent.split("\n");
341
465
  const ctxStart = Math.max(1, startLine - CTX);
342
466
  const ctxBeforeLines = allOldLines.slice(ctxStart - 1, startLine - 1);
343
467
  const newEndLine = startLine + newLines.length - 1;
@@ -346,208 +470,197 @@ export function editFile(input) {
346
470
  const showNew = newLines.slice(0, MAX_LINES);
347
471
  const hunkOldLen = ctxBeforeLines.length + showOld.length + ctxAfterLines.length;
348
472
  const hunkNewLen = ctxBeforeLines.length + showNew.length + ctxAfterLines.length;
349
- const diffParts = [];
350
473
  diffParts.push(`@@ -${ctxStart},${hunkOldLen} +${ctxStart},${hunkNewLen} @@`);
351
- for (const l of ctxBeforeLines)
352
- diffParts.push(` ${l}`);
353
- for (const l of showOld)
354
- diffParts.push(`-${l}`);
355
- if (oldLines.length > MAX_LINES)
356
- diffParts.push(`-... (${oldLines.length - MAX_LINES} more lines)`);
357
- for (const l of showNew)
358
- diffParts.push(`+${l}`);
359
- if (newLines.length > MAX_LINES)
360
- diffParts.push(`+... (${newLines.length - MAX_LINES} more lines)`);
361
- for (const l of ctxAfterLines)
362
- diffParts.push(` ${l}`);
363
- return { success: true, output: `File edited: ${path}\n${diffParts.join("\n")}` };
364
- }
365
- // ============================================================================
366
- // MULTI EDIT
367
- // ============================================================================
368
- export function multiEdit(input) {
369
- const path = resolvePath(input.file_path);
370
- const edits = input.edits;
371
- if (!existsSync(path))
372
- return { success: false, output: `File not found: ${path}` };
373
- if (!Array.isArray(edits) || edits.length === 0)
374
- return { success: false, output: "edits array is required and must not be empty" };
375
- invalidateCache(path); // Invalidate read cache before edit
376
- backupFile(path); // Save backup before modification
377
- let content = readFileSync(path, "utf-8");
378
- const diffParts = [];
379
- const CTX = 2;
380
- const MAX_LINES = 10;
381
- for (let i = 0; i < edits.length; i++) {
382
- const { old_string, new_string } = edits[i];
383
- const idx = content.indexOf(old_string);
384
- if (idx === -1) {
385
- return {
386
- success: false,
387
- output: `Edit ${i + 1}/${edits.length} failed: old_string not found (${i} edits applied successfully before failure)`,
388
- };
389
- }
390
- // Compute line numbers before applying edit
391
- const allOldLines = content.split("\n");
392
- const beforeEdit = content.slice(0, idx);
393
- const startLine = beforeEdit.split("\n").length;
394
- const oldLines = old_string.split("\n");
395
- const newLines = new_string.split("\n");
396
- const newContent = content.slice(0, idx) + new_string + content.slice(idx + old_string.length);
397
- const allNewLines = newContent.split("\n");
398
- const ctxStart = Math.max(1, startLine - CTX);
399
- const ctxBeforeLines = allOldLines.slice(ctxStart - 1, startLine - 1);
400
- const newEndLine = startLine + newLines.length - 1;
401
- const ctxAfterLines = allNewLines.slice(newEndLine, Math.min(newEndLine + CTX, allNewLines.length));
402
- const showOld = oldLines.slice(0, MAX_LINES);
403
- const showNew = newLines.slice(0, MAX_LINES);
404
- const hunkOldLen = ctxBeforeLines.length + showOld.length + ctxAfterLines.length;
405
- const hunkNewLen = ctxBeforeLines.length + showNew.length + ctxAfterLines.length;
406
- diffParts.push(`@@ -${ctxStart},${hunkOldLen} +${ctxStart},${hunkNewLen} @@`);
407
- for (const l of ctxBeforeLines)
408
- diffParts.push(` ${l}`);
409
- for (const l of showOld)
410
- diffParts.push(`-${l}`);
411
- if (oldLines.length > MAX_LINES)
412
- diffParts.push(`-... (${oldLines.length - MAX_LINES} more)`);
413
- for (const l of showNew)
414
- diffParts.push(`+${l}`);
415
- if (newLines.length > MAX_LINES)
416
- diffParts.push(`+... (${newLines.length - MAX_LINES} more)`);
417
- for (const l of ctxAfterLines)
418
- diffParts.push(` ${l}`);
419
- content = newContent;
420
- }
421
- writeFileSync(path, content, "utf-8");
422
- notifyFileChanged(path);
423
- return {
424
- success: true,
425
- output: `Applied ${edits.length} edits to ${path}\n${diffParts.join("\n")}`,
426
- };
474
+ for (const l of ctxBeforeLines) diffParts.push(` ${l}`);
475
+ for (const l of showOld) diffParts.push(`-${l}`);
476
+ if (oldLines.length > MAX_LINES) diffParts.push(`-... (${oldLines.length - MAX_LINES} more)`);
477
+ for (const l of showNew) diffParts.push(`+${l}`);
478
+ if (newLines.length > MAX_LINES) diffParts.push(`+... (${newLines.length - MAX_LINES} more)`);
479
+ for (const l of ctxAfterLines) diffParts.push(` ${l}`);
480
+ content = newContent;
481
+ }
482
+ writeFileSync(path, content, "utf-8");
483
+ notifyFileChanged(path);
484
+ return {
485
+ success: true,
486
+ output: `Applied ${edits.length} edits to ${path}\n${diffParts.join("\n")}`
487
+ };
427
488
  }
489
+
428
490
  // ============================================================================
429
491
  // NOTEBOOK EDIT
430
492
  // ============================================================================
493
+
431
494
  export function notebookEdit(input) {
432
- const path = resolvePath(input.notebook_path);
433
- const newSource = input.new_source || "";
434
- const cellType = input.cell_type || "code";
435
- const editMode = input.edit_mode || "replace";
436
- const cellId = input.cell_id;
437
- if (!existsSync(path))
438
- return { success: false, output: `Notebook not found: ${path}` };
439
- invalidateCache(path); // Invalidate read cache before notebook edit
440
- let notebook;
441
- try {
442
- notebook = JSON.parse(readFileSync(path, "utf-8"));
443
- }
444
- catch (err) {
445
- return { success: false, output: `Failed to parse notebook: ${err}` };
446
- }
447
- const cells = notebook.cells || [];
448
- // Find cell by ID or numeric index
449
- let cellIndex = -1;
450
- if (cellId !== undefined) {
451
- cellIndex = cells.findIndex((c) => c.id === cellId);
452
- if (cellIndex === -1) {
453
- const idx = parseInt(cellId, 10);
454
- if (!isNaN(idx) && idx >= 0 && idx < cells.length)
455
- cellIndex = idx;
456
- }
495
+ const path = resolvePath(input.notebook_path);
496
+ const newSource = input.new_source || "";
497
+ const cellType = input.cell_type || "code";
498
+ const editMode = input.edit_mode || "replace";
499
+ const cellId = input.cell_id;
500
+ if (!existsSync(path)) return {
501
+ success: false,
502
+ output: `Notebook not found: ${path}`
503
+ };
504
+ invalidateCache(path); // Invalidate read cache before notebook edit
505
+
506
+ let notebook;
507
+ try {
508
+ notebook = JSON.parse(readFileSync(path, "utf-8"));
509
+ } catch (err) {
510
+ return {
511
+ success: false,
512
+ output: `Failed to parse notebook: ${err}`
513
+ };
514
+ }
515
+ const cells = notebook.cells || [];
516
+
517
+ // Find cell by ID or numeric index
518
+ let cellIndex = -1;
519
+ if (cellId !== undefined) {
520
+ cellIndex = cells.findIndex(c => c.id === cellId);
521
+ if (cellIndex === -1) {
522
+ const idx = parseInt(cellId, 10);
523
+ if (!isNaN(idx) && idx >= 0 && idx < cells.length) cellIndex = idx;
457
524
  }
458
- // Split source into notebook-format lines (each line ends with \n except last)
459
- const sourceLines = newSource.split("\n").map((line, i, arr) => i < arr.length - 1 ? line + "\n" : line);
460
- switch (editMode) {
461
- case "replace": {
462
- if (cellIndex < 0)
463
- return { success: false, output: `Cell not found: ${cellId}` };
464
- cells[cellIndex].source = sourceLines;
465
- if (cellType)
466
- cells[cellIndex].cell_type = cellType;
467
- break;
468
- }
469
- case "insert": {
470
- const newCell = {
471
- cell_type: cellType,
472
- source: sourceLines,
473
- metadata: {},
474
- };
475
- if (cellType === "code") {
476
- newCell.execution_count = null;
477
- newCell.outputs = [];
478
- }
479
- if (cellIndex >= 0) {
480
- cells.splice(cellIndex + 1, 0, newCell);
481
- }
482
- else {
483
- cells.push(newCell);
484
- }
485
- break;
525
+ }
526
+
527
+ // Split source into notebook-format lines (each line ends with \n except last)
528
+ const sourceLines = newSource.split("\n").map((line, i, arr) => i < arr.length - 1 ? line + "\n" : line);
529
+ switch (editMode) {
530
+ case "replace":
531
+ {
532
+ if (cellIndex < 0) return {
533
+ success: false,
534
+ output: `Cell not found: ${cellId}`
535
+ };
536
+ cells[cellIndex].source = sourceLines;
537
+ if (cellType) cells[cellIndex].cell_type = cellType;
538
+ break;
539
+ }
540
+ case "insert":
541
+ {
542
+ const newCell = {
543
+ cell_type: cellType,
544
+ source: sourceLines,
545
+ metadata: {}
546
+ };
547
+ if (cellType === "code") {
548
+ newCell.execution_count = null;
549
+ newCell.outputs = [];
486
550
  }
487
- case "delete": {
488
- if (cellIndex < 0)
489
- return { success: false, output: `Cell not found: ${cellId}` };
490
- cells.splice(cellIndex, 1);
491
- break;
551
+ if (cellIndex >= 0) {
552
+ cells.splice(cellIndex + 1, 0, newCell);
553
+ } else {
554
+ cells.push(newCell);
492
555
  }
493
- default:
494
- return { success: false, output: `Unknown edit_mode: ${editMode}` };
495
- }
496
- notebook.cells = cells;
497
- writeFileSync(path, JSON.stringify(notebook, null, 1), "utf-8");
498
- return { success: true, output: `Notebook ${editMode}d cell in ${path} (${cells.length} cells total)` };
556
+ break;
557
+ }
558
+ case "delete":
559
+ {
560
+ if (cellIndex < 0) return {
561
+ success: false,
562
+ output: `Cell not found: ${cellId}`
563
+ };
564
+ cells.splice(cellIndex, 1);
565
+ break;
566
+ }
567
+ default:
568
+ return {
569
+ success: false,
570
+ output: `Unknown edit_mode: ${editMode}`
571
+ };
572
+ }
573
+ notebook.cells = cells;
574
+ writeFileSync(path, JSON.stringify(notebook, null, 1), "utf-8");
575
+ return {
576
+ success: true,
577
+ output: `Notebook ${editMode}d cell in ${path} (${cells.length} cells total)`
578
+ };
499
579
  }
580
+
500
581
  // ============================================================================
501
582
  // LIST DIRECTORY
502
583
  // ============================================================================
584
+
503
585
  export function listDirectory(input) {
504
- const path = resolvePath(input.path);
505
- const recursive = input.recursive ?? false;
506
- if (!existsSync(path))
507
- return { success: false, output: `Directory not found: ${path}` };
508
- if (recursive) {
509
- try {
510
- const escapedPath = path.replace(/'/g, "'\\''");
511
- const output = execSync(`find '${escapedPath}' -maxdepth 4 -not -path '*/.*' 2>/dev/null | head -200`, {
512
- encoding: "utf-8", timeout: 5000,
513
- });
514
- return { success: true, output: output.trim() || "(empty)" };
515
- }
516
- catch {
517
- return { success: false, output: "Failed to list directory recursively" };
518
- }
586
+ const path = resolvePath(input.path);
587
+ const recursive = input.recursive ?? false;
588
+ if (!existsSync(path)) return {
589
+ success: false,
590
+ output: `Directory not found: ${path}`
591
+ };
592
+ if (recursive) {
593
+ try {
594
+ const escapedPath = path.replace(/'/g, "'\\''");
595
+ const output = execSync(`find '${escapedPath}' -maxdepth 4 -not -path '*/.*' 2>/dev/null | head -200`, {
596
+ encoding: "utf-8",
597
+ timeout: 5000
598
+ });
599
+ return {
600
+ success: true,
601
+ output: output.trim() || "(empty)"
602
+ };
603
+ } catch {
604
+ return {
605
+ success: false,
606
+ output: "Failed to list directory recursively"
607
+ };
519
608
  }
520
- const entries = readdirSync(path, { withFileTypes: true });
521
- const lines = entries.map((e) => `${e.isDirectory() ? "[dir] " : " "}${e.name}`);
522
- return { success: true, output: lines.join("\n") || "(empty directory)" };
609
+ }
610
+ const entries = readdirSync(path, {
611
+ withFileTypes: true
612
+ });
613
+ const lines = entries.map(e => `${e.isDirectory() ? "[dir] " : " "}${e.name}`);
614
+ return {
615
+ success: true,
616
+ output: lines.join("\n") || "(empty directory)"
617
+ };
523
618
  }
619
+
524
620
  // ============================================================================
525
621
  // SEARCH FILES / SEARCH CONTENT (legacy)
526
622
  // ============================================================================
623
+
527
624
  export function searchFiles(input) {
528
- const pattern = input.pattern.replace(/'/g, "'\\''");
529
- const path = resolvePath(input.path).replace(/'/g, "'\\''");
530
- try {
531
- const output = execSync(`find '${path}' -name '${pattern}' -type f -not -path '*/.*' 2>/dev/null | head -100`, { encoding: "utf-8", timeout: 10000 });
532
- return { success: true, output: output.trim() || "No files found" };
533
- }
534
- catch {
535
- return { success: false, output: "Search failed" };
536
- }
625
+ const pattern = input.pattern.replace(/'/g, "'\\''");
626
+ const path = resolvePath(input.path).replace(/'/g, "'\\''");
627
+ try {
628
+ const output = execSync(`find '${path}' -name '${pattern}' -type f -not -path '*/.*' 2>/dev/null | head -100`, {
629
+ encoding: "utf-8",
630
+ timeout: 10000
631
+ });
632
+ return {
633
+ success: true,
634
+ output: output.trim() || "No files found"
635
+ };
636
+ } catch {
637
+ return {
638
+ success: false,
639
+ output: "Search failed"
640
+ };
641
+ }
537
642
  }
538
643
  export function searchContent(input) {
539
- const query = input.query;
540
- const path = resolvePath(input.path);
541
- const filePattern = input.file_pattern;
542
- let cmd = `grep -rn '${query.replace(/'/g, "'\\''")}' '${path.replace(/'/g, "'\\''")}'`;
543
- if (filePattern)
544
- cmd += ` --include='${filePattern.replace(/'/g, "'\\''")}'`;
545
- cmd += " 2>/dev/null | head -50";
546
- try {
547
- const output = execSync(cmd, { encoding: "utf-8", timeout: 10000 });
548
- return { success: true, output: output.trim() || "No matches found" };
549
- }
550
- catch {
551
- return { success: true, output: "No matches found" };
552
- }
644
+ const query = input.query;
645
+ const path = resolvePath(input.path);
646
+ const filePattern = input.file_pattern;
647
+ let cmd = `grep -rn '${query.replace(/'/g, "'\\''")}' '${path.replace(/'/g, "'\\''")}'`;
648
+ if (filePattern) cmd += ` --include='${filePattern.replace(/'/g, "'\\''")}'`;
649
+ cmd += " 2>/dev/null | head -50";
650
+ try {
651
+ const output = execSync(cmd, {
652
+ encoding: "utf-8",
653
+ timeout: 10000
654
+ });
655
+ return {
656
+ success: true,
657
+ output: output.trim() || "No matches found"
658
+ };
659
+ } catch {
660
+ return {
661
+ success: true,
662
+ output: "No matches found"
663
+ };
664
+ }
553
665
  }
666
+ //# sourceMappingURL=file-ops.js.map