whale-code 6.5.5 → 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 (847) 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 +5 -1
  73. package/dist/cli/services/agent-config.js +66 -36
  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 +976 -688
  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.js +187 -169
  107. package/dist/cli/services/error-logger.js.map +1 -0
  108. package/dist/cli/services/file-history.d.ts +1 -1
  109. package/dist/cli/services/file-history.js +50 -54
  110. package/dist/cli/services/file-history.js.map +1 -0
  111. package/dist/cli/services/format-server-response.js +332 -372
  112. package/dist/cli/services/format-server-response.js.map +1 -0
  113. package/dist/cli/services/git-context.js +61 -45
  114. package/dist/cli/services/git-context.js.map +1 -0
  115. package/dist/cli/services/hooks.d.ts +2 -2
  116. package/dist/cli/services/hooks.js +195 -180
  117. package/dist/cli/services/hooks.js.map +1 -0
  118. package/dist/cli/services/ink-incremental.d.ts +19 -0
  119. package/dist/cli/services/ink-incremental.js +59 -0
  120. package/dist/cli/services/ink-incremental.js.map +1 -0
  121. package/dist/cli/services/ink-resize-fix.js +54 -44
  122. package/dist/cli/services/ink-resize-fix.js.map +1 -0
  123. package/dist/cli/services/ink-sync-output.d.ts +12 -0
  124. package/dist/cli/services/ink-sync-output.js +16 -0
  125. package/dist/cli/services/ink-sync-output.js.map +1 -0
  126. package/dist/cli/services/interactive-tools.js +268 -212
  127. package/dist/cli/services/interactive-tools.js.map +1 -0
  128. package/dist/cli/services/keybinding-manager.d.ts +11 -1
  129. package/dist/cli/services/keybinding-manager.js +126 -63
  130. package/dist/cli/services/keybinding-manager.js.map +1 -0
  131. package/dist/cli/services/local-tools.d.ts +1 -1
  132. package/dist/cli/services/local-tools.js +939 -656
  133. package/dist/cli/services/local-tools.js.map +1 -0
  134. package/dist/cli/services/lsp-manager.js +757 -594
  135. package/dist/cli/services/lsp-manager.js.map +1 -0
  136. package/dist/cli/services/mcp-client.d.ts +1 -1
  137. package/dist/cli/services/mcp-client.js +173 -134
  138. package/dist/cli/services/mcp-client.js.map +1 -0
  139. package/dist/cli/services/memory-manager.js +53 -40
  140. package/dist/cli/services/memory-manager.js.map +1 -0
  141. package/dist/cli/services/model-manager.js +55 -40
  142. package/dist/cli/services/model-manager.js.map +1 -0
  143. package/dist/cli/services/model-router.js +115 -85
  144. package/dist/cli/services/model-router.js.map +1 -0
  145. package/dist/cli/services/paths.d.ts +30 -0
  146. package/dist/cli/services/paths.js +81 -0
  147. package/dist/cli/services/paths.js.map +1 -0
  148. package/dist/cli/services/permission-modes.js +32 -25
  149. package/dist/cli/services/permission-modes.js.map +1 -0
  150. package/dist/cli/services/rewind.js +182 -168
  151. package/dist/cli/services/rewind.js.map +1 -0
  152. package/dist/cli/services/ripgrep.js +115 -115
  153. package/dist/cli/services/ripgrep.js.map +1 -0
  154. package/dist/cli/services/sandbox.d.ts +1 -1
  155. package/dist/cli/services/sandbox.js +58 -37
  156. package/dist/cli/services/sandbox.js.map +1 -0
  157. package/dist/cli/services/server-tools.js +738 -565
  158. package/dist/cli/services/server-tools.js.map +1 -0
  159. package/dist/cli/services/session-persistence.js +69 -74
  160. package/dist/cli/services/session-persistence.js.map +1 -0
  161. package/dist/cli/services/subagent-worker.js +42 -27
  162. package/dist/cli/services/subagent-worker.js.map +1 -0
  163. package/dist/cli/services/subagent.d.ts +2 -0
  164. package/dist/cli/services/subagent.js +605 -433
  165. package/dist/cli/services/subagent.js.map +1 -0
  166. package/dist/cli/services/system-prompt.js +86 -78
  167. package/dist/cli/services/system-prompt.js.map +1 -0
  168. package/dist/cli/services/task-decomposer.d.ts +1 -1
  169. package/dist/cli/services/task-decomposer.js +172 -139
  170. package/dist/cli/services/task-decomposer.js.map +1 -0
  171. package/dist/cli/services/team-lead.d.ts +2 -2
  172. package/dist/cli/services/team-lead.js +727 -529
  173. package/dist/cli/services/team-lead.js.map +1 -0
  174. package/dist/cli/services/team-state.js +319 -319
  175. package/dist/cli/services/team-state.js.map +1 -0
  176. package/dist/cli/services/teammate.d.ts +8 -2
  177. package/dist/cli/services/teammate.js +857 -569
  178. package/dist/cli/services/teammate.js.map +1 -0
  179. package/dist/cli/services/telemetry.d.ts +6 -1
  180. package/dist/cli/services/telemetry.js +180 -157
  181. package/dist/cli/services/telemetry.js.map +1 -0
  182. package/dist/cli/services/tools/agent-tools.d.ts +3 -3
  183. package/dist/cli/services/tools/agent-tools.js +480 -322
  184. package/dist/cli/services/tools/agent-tools.js.map +1 -0
  185. package/dist/cli/services/tools/file-ops.js +563 -450
  186. package/dist/cli/services/tools/file-ops.js.map +1 -0
  187. package/dist/cli/services/tools/search-tools.js +231 -162
  188. package/dist/cli/services/tools/search-tools.js.map +1 -0
  189. package/dist/cli/services/tools/shell-exec.js +197 -151
  190. package/dist/cli/services/tools/shell-exec.js.map +1 -0
  191. package/dist/cli/services/tools/task-manager.js +206 -173
  192. package/dist/cli/services/tools/task-manager.js.map +1 -0
  193. package/dist/cli/services/tools/web-tools.js +388 -341
  194. package/dist/cli/services/tools/web-tools.js.map +1 -0
  195. package/dist/cli/setup/SetupApp.d.ts +2 -2
  196. package/dist/cli/setup/SetupApp.js +608 -160
  197. package/dist/cli/setup/SetupApp.js.map +1 -0
  198. package/dist/cli/shared/ErrorBoundary.d.ts +22 -0
  199. package/dist/cli/shared/ErrorBoundary.js +73 -0
  200. package/dist/cli/shared/ErrorBoundary.js.map +1 -0
  201. package/dist/cli/shared/MatrixIntro.js +66 -69
  202. package/dist/cli/shared/MatrixIntro.js.map +1 -0
  203. package/dist/cli/shared/SpinnerSlot.d.ts +14 -0
  204. package/dist/cli/shared/SpinnerSlot.js +63 -0
  205. package/dist/cli/shared/SpinnerSlot.js.map +1 -0
  206. package/dist/cli/shared/Theme.d.ts +1 -1
  207. package/dist/cli/shared/Theme.js +136 -92
  208. package/dist/cli/shared/Theme.js.map +1 -0
  209. package/dist/cli/shared/WhaleBanner.js +99 -11
  210. package/dist/cli/shared/WhaleBanner.js.map +1 -0
  211. package/dist/cli/shared/markdown.d.ts +3 -1
  212. package/dist/cli/shared/markdown.js +736 -674
  213. package/dist/cli/shared/markdown.js.map +1 -0
  214. package/dist/cli/shared/marked-terminal.d.js +2 -0
  215. package/dist/cli/shared/marked-terminal.d.js.map +1 -0
  216. package/dist/cli/shared/theme-manager.js +99 -90
  217. package/dist/cli/shared/theme-manager.js.map +1 -0
  218. package/dist/cli/shared/theme-presets.js +256 -254
  219. package/dist/cli/shared/theme-presets.js.map +1 -0
  220. package/dist/cli/status/StatusApp.js +235 -86
  221. package/dist/cli/status/StatusApp.js.map +1 -0
  222. package/dist/cli/stores/StoreApp.js +275 -65
  223. package/dist/cli/stores/StoreApp.js.map +1 -0
  224. package/dist/index.d.ts +2 -2
  225. package/dist/index.js +509 -396
  226. package/dist/index.js.map +1 -0
  227. package/dist/local-agent/connection.d.ts +2 -2
  228. package/dist/local-agent/connection.js +352 -293
  229. package/dist/local-agent/connection.js.map +1 -0
  230. package/dist/local-agent/discovery.js +259 -122
  231. package/dist/local-agent/discovery.js.map +1 -0
  232. package/dist/local-agent/executor.js +216 -193
  233. package/dist/local-agent/executor.js.map +1 -0
  234. package/dist/local-agent/index.d.ts +2 -2
  235. package/dist/local-agent/index.js +156 -156
  236. package/dist/local-agent/index.js.map +1 -0
  237. package/dist/node/adapters/base.js +18 -8
  238. package/dist/node/adapters/base.js.map +1 -0
  239. package/dist/node/adapters/discord.js +286 -275
  240. package/dist/node/adapters/discord.js.map +1 -0
  241. package/dist/node/adapters/email.js +189 -202
  242. package/dist/node/adapters/email.js.map +1 -0
  243. package/dist/node/adapters/imessage.js +145 -142
  244. package/dist/node/adapters/imessage.js.map +1 -0
  245. package/dist/node/adapters/slack.js +237 -236
  246. package/dist/node/adapters/slack.js.map +1 -0
  247. package/dist/node/adapters/sms.js +149 -151
  248. package/dist/node/adapters/sms.js.map +1 -0
  249. package/dist/node/adapters/telegram.js +88 -92
  250. package/dist/node/adapters/telegram.js.map +1 -0
  251. package/dist/node/adapters/webchat.js +160 -136
  252. package/dist/node/adapters/webchat.js.map +1 -0
  253. package/dist/node/adapters/whatsapp.js +212 -215
  254. package/dist/node/adapters/whatsapp.js.map +1 -0
  255. package/dist/node/cli.js +884 -653
  256. package/dist/node/cli.js.map +1 -0
  257. package/dist/node/config.js +20 -18
  258. package/dist/node/config.js.map +1 -0
  259. package/dist/node/gateway-client.js +191 -181
  260. package/dist/node/gateway-client.js.map +1 -0
  261. package/dist/node/portal/clipboard.js +161 -130
  262. package/dist/node/portal/clipboard.js.map +1 -0
  263. package/dist/node/portal/discovery.js +51 -45
  264. package/dist/node/portal/discovery.js.map +1 -0
  265. package/dist/node/portal/forward.js +64 -58
  266. package/dist/node/portal/forward.js.map +1 -0
  267. package/dist/node/portal/index.js +246 -221
  268. package/dist/node/portal/index.js.map +1 -0
  269. package/dist/node/portal/multiplexer.js +192 -182
  270. package/dist/node/portal/multiplexer.js.map +1 -0
  271. package/dist/node/portal/permissions.js +102 -70
  272. package/dist/node/portal/permissions.js.map +1 -0
  273. package/dist/node/portal/protocol.js +153 -116
  274. package/dist/node/portal/protocol.js.map +1 -0
  275. package/dist/node/portal/screen.js +80 -69
  276. package/dist/node/portal/screen.js.map +1 -0
  277. package/dist/node/portal/session.js +124 -117
  278. package/dist/node/portal/session.js.map +1 -0
  279. package/dist/node/portal/shell.js +140 -113
  280. package/dist/node/portal/shell.js.map +1 -0
  281. package/dist/node/portal/stream.js +77 -75
  282. package/dist/node/portal/stream.js.map +1 -0
  283. package/dist/node/portal/transfer.js +190 -167
  284. package/dist/node/portal/transfer.js.map +1 -0
  285. package/dist/node/portal/ui.js +124 -99
  286. package/dist/node/portal/ui.js.map +1 -0
  287. package/dist/node/remote-desktop/compile-helper.js +50 -45
  288. package/dist/node/remote-desktop/compile-helper.js.map +1 -0
  289. package/dist/node/remote-desktop/index.js +215 -187
  290. package/dist/node/remote-desktop/index.js.map +1 -0
  291. package/dist/node/remote-desktop/protocol.js +45 -29
  292. package/dist/node/remote-desktop/protocol.js.map +1 -0
  293. package/dist/node/runtime.js +493 -410
  294. package/dist/node/runtime.js.map +1 -0
  295. package/dist/server/handlers/__test-utils__/test-db.js +39 -89
  296. package/dist/server/handlers/__test-utils__/test-db.js.map +1 -0
  297. package/dist/server/handlers/analytics.js +467 -261
  298. package/dist/server/handlers/analytics.js.map +1 -0
  299. package/dist/server/handlers/api-docs.js +1030 -895
  300. package/dist/server/handlers/api-docs.js.map +1 -0
  301. package/dist/server/handlers/api-keys.js +291 -242
  302. package/dist/server/handlers/api-keys.js.map +1 -0
  303. package/dist/server/handlers/billing.js +330 -239
  304. package/dist/server/handlers/billing.js.map +1 -0
  305. package/dist/server/handlers/browser.js +468 -395
  306. package/dist/server/handlers/browser.js.map +1 -0
  307. package/dist/server/handlers/catalog.js +1377 -978
  308. package/dist/server/handlers/catalog.js.map +1 -0
  309. package/dist/server/handlers/clickhouse.js +157 -109
  310. package/dist/server/handlers/clickhouse.js.map +1 -0
  311. package/dist/server/handlers/comms.js +1439 -984
  312. package/dist/server/handlers/comms.js.map +1 -0
  313. package/dist/server/handlers/creations.js +461 -394
  314. package/dist/server/handlers/creations.js.map +1 -0
  315. package/dist/server/handlers/crm.js +1082 -791
  316. package/dist/server/handlers/crm.js.map +1 -0
  317. package/dist/server/handlers/discovery.js +251 -232
  318. package/dist/server/handlers/discovery.js.map +1 -0
  319. package/dist/server/handlers/embeddings.js +241 -164
  320. package/dist/server/handlers/embeddings.js.map +1 -0
  321. package/dist/server/handlers/enrichment.js +887 -718
  322. package/dist/server/handlers/enrichment.js.map +1 -0
  323. package/dist/server/handlers/image-gen.js +467 -376
  324. package/dist/server/handlers/image-gen.js.map +1 -0
  325. package/dist/server/handlers/inventory.js +797 -424
  326. package/dist/server/handlers/inventory.js.map +1 -0
  327. package/dist/server/handlers/kali.js +272 -230
  328. package/dist/server/handlers/kali.js.map +1 -0
  329. package/dist/server/handlers/llm-providers.js +803 -580
  330. package/dist/server/handlers/llm-providers.js.map +1 -0
  331. package/dist/server/handlers/local-agent.js +133 -105
  332. package/dist/server/handlers/local-agent.js.map +1 -0
  333. package/dist/server/handlers/media.js +1179 -857
  334. package/dist/server/handlers/media.js.map +1 -0
  335. package/dist/server/handlers/meta-ads.js +2669 -2093
  336. package/dist/server/handlers/meta-ads.js.map +1 -0
  337. package/dist/server/handlers/nodes.js +1321 -913
  338. package/dist/server/handlers/nodes.js.map +1 -0
  339. package/dist/server/handlers/operations.js +183 -157
  340. package/dist/server/handlers/operations.js.map +1 -0
  341. package/dist/server/handlers/platform.js +346 -210
  342. package/dist/server/handlers/platform.js.map +1 -0
  343. package/dist/server/handlers/remove-bg.js +118 -86
  344. package/dist/server/handlers/remove-bg.js.map +1 -0
  345. package/dist/server/handlers/storefront.js +586 -446
  346. package/dist/server/handlers/storefront.js.map +1 -0
  347. package/dist/server/handlers/supply-chain.js +546 -326
  348. package/dist/server/handlers/supply-chain.js.map +1 -0
  349. package/dist/server/handlers/transcription.js +106 -97
  350. package/dist/server/handlers/transcription.js.map +1 -0
  351. package/dist/server/handlers/video-gen.js +593 -424
  352. package/dist/server/handlers/video-gen.js.map +1 -0
  353. package/dist/server/handlers/voice.js +1458 -1039
  354. package/dist/server/handlers/voice.js.map +1 -0
  355. package/dist/server/handlers/workflow-steps.js +2837 -2116
  356. package/dist/server/handlers/workflow-steps.js.map +1 -0
  357. package/dist/server/handlers/workflows.js +1630 -933
  358. package/dist/server/handlers/workflows.js.map +1 -0
  359. package/dist/server/index.js +3167 -2422
  360. package/dist/server/index.js.map +1 -0
  361. package/dist/server/lib/batch-client.js +471 -409
  362. package/dist/server/lib/batch-client.js.map +1 -0
  363. package/dist/server/lib/clickhouse-buffer.js +118 -104
  364. package/dist/server/lib/clickhouse-buffer.js.map +1 -0
  365. package/dist/server/lib/clickhouse-client.js +107 -107
  366. package/dist/server/lib/clickhouse-client.js.map +1 -0
  367. package/dist/server/lib/coa-renderer.js +1786 -356
  368. package/dist/server/lib/coa-renderer.js.map +1 -0
  369. package/dist/server/lib/code-worker-pool.js +227 -177
  370. package/dist/server/lib/code-worker-pool.js.map +1 -0
  371. package/dist/server/lib/code-worker.js +174 -164
  372. package/dist/server/lib/code-worker.js.map +1 -0
  373. package/dist/server/lib/compaction-service.d.ts +2 -12
  374. package/dist/server/lib/compaction-service.js +74 -184
  375. package/dist/server/lib/compaction-service.js.map +1 -0
  376. package/dist/server/lib/logger.js +36 -24
  377. package/dist/server/lib/logger.js.map +1 -0
  378. package/dist/server/lib/otel.js +101 -80
  379. package/dist/server/lib/otel.js.map +1 -0
  380. package/dist/server/lib/pdf-renderer.js +952 -788
  381. package/dist/server/lib/pdf-renderer.js.map +1 -0
  382. package/dist/server/lib/prompt-sanitizer.js +188 -108
  383. package/dist/server/lib/prompt-sanitizer.js.map +1 -0
  384. package/dist/server/lib/provider-capabilities.js +136 -138
  385. package/dist/server/lib/provider-capabilities.js.map +1 -0
  386. package/dist/server/lib/provider-failover.js +190 -168
  387. package/dist/server/lib/provider-failover.js.map +1 -0
  388. package/dist/server/lib/rate-limiter.js +186 -117
  389. package/dist/server/lib/rate-limiter.js.map +1 -0
  390. package/dist/server/lib/react-pdf-layout.js +551 -382
  391. package/dist/server/lib/react-pdf-layout.js.map +1 -0
  392. package/dist/server/lib/server-agent-loop.d.ts +4 -1
  393. package/dist/server/lib/server-agent-loop.js +906 -634
  394. package/dist/server/lib/server-agent-loop.js.map +1 -0
  395. package/dist/server/lib/server-subagent.js +260 -164
  396. package/dist/server/lib/server-subagent.js.map +1 -0
  397. package/dist/server/lib/session-checkpoint.js +105 -96
  398. package/dist/server/lib/session-checkpoint.js.map +1 -0
  399. package/dist/server/lib/ssrf-guard.js +193 -184
  400. package/dist/server/lib/ssrf-guard.js.map +1 -0
  401. package/dist/server/lib/supabase-client.js +94 -82
  402. package/dist/server/lib/supabase-client.js.map +1 -0
  403. package/dist/server/lib/template-resolver.js +154 -176
  404. package/dist/server/lib/template-resolver.js.map +1 -0
  405. package/dist/server/lib/utils.js +242 -133
  406. package/dist/server/lib/utils.js.map +1 -0
  407. package/dist/server/local-agent-gateway.d.ts +2 -2
  408. package/dist/server/local-agent-gateway.js +785 -627
  409. package/dist/server/local-agent-gateway.js.map +1 -0
  410. package/dist/server/providers/anthropic.js +250 -172
  411. package/dist/server/providers/anthropic.js.map +1 -0
  412. package/dist/server/providers/bedrock.js +217 -158
  413. package/dist/server/providers/bedrock.js.map +1 -0
  414. package/dist/server/providers/gemini.js +548 -418
  415. package/dist/server/providers/gemini.js.map +1 -0
  416. package/dist/server/providers/openai.js +571 -437
  417. package/dist/server/providers/openai.js.map +1 -0
  418. package/dist/server/providers/registry.js +23 -18
  419. package/dist/server/providers/registry.js.map +1 -0
  420. package/dist/server/providers/shared.js +123 -95
  421. package/dist/server/providers/shared.js.map +1 -0
  422. package/dist/server/providers/types.js +1 -11
  423. package/dist/server/providers/types.js.map +1 -0
  424. package/dist/server/proxy-handlers.js +209 -165
  425. package/dist/server/proxy-handlers.js.map +1 -0
  426. package/dist/server/tool-router.js +959 -599
  427. package/dist/server/tool-router.js.map +1 -0
  428. package/dist/server/validation.js +248 -188
  429. package/dist/server/validation.js.map +1 -0
  430. package/dist/server/worker.js +202 -133
  431. package/dist/server/worker.js.map +1 -0
  432. package/dist/setup.d.ts +2 -2
  433. package/dist/setup.js +151 -147
  434. package/dist/setup.js.map +1 -0
  435. package/dist/shared/agent-core.d.ts +115 -26
  436. package/dist/shared/agent-core.js +956 -522
  437. package/dist/shared/agent-core.js.map +1 -0
  438. package/dist/shared/anthropic-types.js +1 -6
  439. package/dist/shared/anthropic-types.js.map +1 -0
  440. package/dist/shared/api-client.d.ts +16 -9
  441. package/dist/shared/api-client.js +419 -327
  442. package/dist/shared/api-client.js.map +1 -0
  443. package/dist/shared/compaction.d.ts +36 -0
  444. package/dist/shared/compaction.js +138 -0
  445. package/dist/shared/compaction.js.map +1 -0
  446. package/dist/shared/constants.js +67 -64
  447. package/dist/shared/constants.js.map +1 -0
  448. package/dist/shared/sse-parser.js +221 -219
  449. package/dist/shared/sse-parser.js.map +1 -0
  450. package/dist/shared/tool-dispatch.d.ts +4 -0
  451. package/dist/shared/tool-dispatch.js +226 -165
  452. package/dist/shared/tool-dispatch.js.map +1 -0
  453. package/dist/shared/types.js +1 -6
  454. package/dist/shared/types.js.map +1 -0
  455. package/dist/types/cli-highlight.d.js +2 -0
  456. package/dist/types/cli-highlight.d.js.map +1 -0
  457. package/dist/types/diff.d.js +2 -0
  458. package/dist/types/diff.d.js.map +1 -0
  459. package/dist/types/pdf-parse.d.js +2 -0
  460. package/dist/types/pdf-parse.d.js.map +1 -0
  461. package/dist/updater.d.ts +1 -1
  462. package/dist/updater.js +118 -92
  463. package/dist/updater.js.map +1 -0
  464. package/dist/webchat/widget.js +227 -380
  465. package/dist/webchat/widget.js.map +1 -0
  466. package/package.json +22 -10
  467. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  468. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  469. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  470. package/vendor/ink/build/apply-styles.js +175 -0
  471. package/vendor/ink/build/build-layout.js +77 -0
  472. package/vendor/ink/build/calculate-wrapped-text.js +53 -0
  473. package/vendor/ink/build/colorize.d.ts +3 -0
  474. package/vendor/ink/build/colorize.js +48 -0
  475. package/vendor/ink/build/colorize.js.map +1 -0
  476. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  477. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  478. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  479. package/vendor/ink/build/components/App.d.ts +18 -0
  480. package/vendor/ink/build/components/App.js +351 -0
  481. package/vendor/ink/build/components/App.js.map +1 -0
  482. package/vendor/ink/build/components/AppContext.d.ts +15 -0
  483. package/vendor/ink/build/components/AppContext.js +11 -0
  484. package/vendor/ink/build/components/AppContext.js.map +1 -0
  485. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  486. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  487. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  488. package/vendor/ink/build/components/Box.d.ts +117 -0
  489. package/vendor/ink/build/components/Box.js +34 -0
  490. package/vendor/ink/build/components/Box.js.map +1 -0
  491. package/vendor/ink/build/components/Color.js +62 -0
  492. package/vendor/ink/build/components/Cursor.d.ts +83 -0
  493. package/vendor/ink/build/components/Cursor.js +53 -0
  494. package/vendor/ink/build/components/Cursor.js.map +1 -0
  495. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  496. package/vendor/ink/build/components/CursorContext.js +8 -0
  497. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  498. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  499. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  500. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  501. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  502. package/vendor/ink/build/components/ErrorOverview.js +84 -0
  503. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  504. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  505. package/vendor/ink/build/components/FocusContext.js +17 -0
  506. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  507. package/vendor/ink/build/components/Newline.d.ts +13 -0
  508. package/vendor/ink/build/components/Newline.js +8 -0
  509. package/vendor/ink/build/components/Newline.js.map +1 -0
  510. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  511. package/vendor/ink/build/components/Spacer.js +11 -0
  512. package/vendor/ink/build/components/Spacer.js.map +1 -0
  513. package/vendor/ink/build/components/Static.d.ts +24 -0
  514. package/vendor/ink/build/components/Static.js +28 -0
  515. package/vendor/ink/build/components/Static.js.map +1 -0
  516. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  517. package/vendor/ink/build/components/StderrContext.js +13 -0
  518. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  519. package/vendor/ink/build/components/StdinContext.d.ts +22 -0
  520. package/vendor/ink/build/components/StdinContext.js +19 -0
  521. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  522. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  523. package/vendor/ink/build/components/StdoutContext.js +13 -0
  524. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  525. package/vendor/ink/build/components/Text.d.ts +55 -0
  526. package/vendor/ink/build/components/Text.js +50 -0
  527. package/vendor/ink/build/components/Text.js.map +1 -0
  528. package/vendor/ink/build/components/Transform.d.ts +16 -0
  529. package/vendor/ink/build/components/Transform.js +15 -0
  530. package/vendor/ink/build/components/Transform.js.map +1 -0
  531. package/vendor/ink/build/cursor-helpers.d.ts +38 -0
  532. package/vendor/ink/build/cursor-helpers.js +56 -0
  533. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  534. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  535. package/vendor/ink/build/devtools-window-polyfill.js +65 -0
  536. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  537. package/vendor/ink/build/devtools.d.ts +1 -0
  538. package/vendor/ink/build/devtools.js +11 -0
  539. package/vendor/ink/build/devtools.js.map +1 -0
  540. package/vendor/ink/build/dom.d.ts +56 -0
  541. package/vendor/ink/build/dom.js +124 -0
  542. package/vendor/ink/build/dom.js.map +1 -0
  543. package/vendor/ink/build/experimental/apply-style.js +140 -0
  544. package/vendor/ink/build/experimental/dom.js +123 -0
  545. package/vendor/ink/build/experimental/output.js +91 -0
  546. package/vendor/ink/build/experimental/reconciler.js +141 -0
  547. package/vendor/ink/build/experimental/renderer.js +81 -0
  548. package/vendor/ink/build/get-max-width.d.ts +3 -0
  549. package/vendor/ink/build/get-max-width.js +10 -0
  550. package/vendor/ink/build/get-max-width.js.map +1 -0
  551. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  552. package/vendor/ink/build/hooks/use-app.js +8 -0
  553. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  554. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  555. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  556. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  557. package/vendor/ink/build/hooks/use-focus-manager.d.ts +28 -0
  558. package/vendor/ink/build/hooks/use-focus-manager.js +17 -0
  559. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  560. package/vendor/ink/build/hooks/use-focus.d.ts +29 -0
  561. package/vendor/ink/build/hooks/use-focus.js +42 -0
  562. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  563. package/vendor/ink/build/hooks/use-input.d.ts +131 -0
  564. package/vendor/ink/build/hooks/use-input.js +124 -0
  565. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  566. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +5 -0
  567. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +11 -0
  568. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  569. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  570. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  571. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  572. package/vendor/ink/build/hooks/use-stdin.d.ts +5 -0
  573. package/vendor/ink/build/hooks/use-stdin.js +8 -0
  574. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  575. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  576. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  577. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  578. package/vendor/ink/build/hooks/useInput.js +38 -0
  579. package/vendor/ink/build/index.d.ts +34 -0
  580. package/vendor/ink/build/index.js +20 -0
  581. package/vendor/ink/build/index.js.map +1 -0
  582. package/vendor/ink/build/ink.d.ts +90 -0
  583. package/vendor/ink/build/ink.js +654 -0
  584. package/vendor/ink/build/ink.js.map +1 -0
  585. package/vendor/ink/build/input-parser.d.ts +7 -0
  586. package/vendor/ink/build/input-parser.js +154 -0
  587. package/vendor/ink/build/input-parser.js.map +1 -0
  588. package/vendor/ink/build/instance.js +205 -0
  589. package/vendor/ink/build/instances.d.ts +3 -0
  590. package/vendor/ink/build/instances.js +8 -0
  591. package/vendor/ink/build/instances.js.map +1 -0
  592. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  593. package/vendor/ink/build/kitty-keyboard.js +32 -0
  594. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  595. package/vendor/ink/build/layout.d.ts +7 -0
  596. package/vendor/ink/build/layout.js +33 -0
  597. package/vendor/ink/build/layout.js.map +1 -0
  598. package/vendor/ink/build/log-update.d.ts +19 -0
  599. package/vendor/ink/build/log-update.js +243 -0
  600. package/vendor/ink/build/log-update.js.map +1 -0
  601. package/vendor/ink/build/measure-element.d.ts +16 -0
  602. package/vendor/ink/build/measure-element.js +9 -0
  603. package/vendor/ink/build/measure-element.js.map +1 -0
  604. package/vendor/ink/build/measure-text.d.ts +6 -0
  605. package/vendor/ink/build/measure-text.js +21 -0
  606. package/vendor/ink/build/measure-text.js.map +1 -0
  607. package/vendor/ink/build/options.d.ts +52 -0
  608. package/vendor/ink/build/options.js +2 -0
  609. package/vendor/ink/build/options.js.map +1 -0
  610. package/vendor/ink/build/output.d.ts +35 -0
  611. package/vendor/ink/build/output.js +183 -0
  612. package/vendor/ink/build/output.js.map +1 -0
  613. package/vendor/ink/build/parse-keypress.d.ts +22 -0
  614. package/vendor/ink/build/parse-keypress.js +493 -0
  615. package/vendor/ink/build/parse-keypress.js.map +1 -0
  616. package/vendor/ink/build/reconciler.d.ts +4 -0
  617. package/vendor/ink/build/reconciler.js +274 -0
  618. package/vendor/ink/build/reconciler.js.map +1 -0
  619. package/vendor/ink/build/render-background.d.ts +4 -0
  620. package/vendor/ink/build/render-background.js +25 -0
  621. package/vendor/ink/build/render-background.js.map +1 -0
  622. package/vendor/ink/build/render-border.d.ts +4 -0
  623. package/vendor/ink/build/render-border.js +73 -0
  624. package/vendor/ink/build/render-border.js.map +1 -0
  625. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  626. package/vendor/ink/build/render-node-to-output.js +147 -0
  627. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  628. package/vendor/ink/build/render-to-string.d.ts +38 -0
  629. package/vendor/ink/build/render-to-string.js +115 -0
  630. package/vendor/ink/build/render-to-string.js.map +1 -0
  631. package/vendor/ink/build/render.d.ts +121 -0
  632. package/vendor/ink/build/render.js +55 -0
  633. package/vendor/ink/build/render.js.map +1 -0
  634. package/vendor/ink/build/renderer.d.ts +8 -0
  635. package/vendor/ink/build/renderer.js +55 -0
  636. package/vendor/ink/build/renderer.js.map +1 -0
  637. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  638. package/vendor/ink/build/sanitize-ansi.js +27 -0
  639. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  640. package/vendor/ink/build/screen-reader-update.d.ts +13 -0
  641. package/vendor/ink/build/screen-reader-update.js +38 -0
  642. package/vendor/ink/build/screen-reader-update.js.map +1 -0
  643. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  644. package/vendor/ink/build/squash-text-nodes.js +36 -0
  645. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  646. package/vendor/ink/build/styles.d.ts +240 -0
  647. package/vendor/ink/build/styles.js +232 -0
  648. package/vendor/ink/build/styles.js.map +1 -0
  649. package/vendor/ink/build/utils.d.ts +2 -0
  650. package/vendor/ink/build/utils.js +4 -0
  651. package/vendor/ink/build/utils.js.map +1 -0
  652. package/vendor/ink/build/wrap-text.d.ts +3 -0
  653. package/vendor/ink/build/wrap-text.js +31 -0
  654. package/vendor/ink/build/wrap-text.js.map +1 -0
  655. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  656. package/vendor/ink/build/write-synchronized.js +7 -0
  657. package/vendor/ink/build/write-synchronized.js.map +1 -0
  658. package/vendor/ink/license +10 -0
  659. package/vendor/ink/node_modules/@types/node/LICENSE +21 -0
  660. package/vendor/ink/node_modules/@types/node/README.md +15 -0
  661. package/vendor/ink/node_modules/@types/node/assert/strict.d.ts +105 -0
  662. package/vendor/ink/node_modules/@types/node/assert.d.ts +955 -0
  663. package/vendor/ink/node_modules/@types/node/async_hooks.d.ts +623 -0
  664. package/vendor/ink/node_modules/@types/node/buffer.buffer.d.ts +466 -0
  665. package/vendor/ink/node_modules/@types/node/buffer.d.ts +1810 -0
  666. package/vendor/ink/node_modules/@types/node/child_process.d.ts +1428 -0
  667. package/vendor/ink/node_modules/@types/node/cluster.d.ts +486 -0
  668. package/vendor/ink/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
  669. package/vendor/ink/node_modules/@types/node/console.d.ts +151 -0
  670. package/vendor/ink/node_modules/@types/node/constants.d.ts +20 -0
  671. package/vendor/ink/node_modules/@types/node/crypto.d.ts +4065 -0
  672. package/vendor/ink/node_modules/@types/node/dgram.d.ts +564 -0
  673. package/vendor/ink/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
  674. package/vendor/ink/node_modules/@types/node/dns/promises.d.ts +503 -0
  675. package/vendor/ink/node_modules/@types/node/dns.d.ts +922 -0
  676. package/vendor/ink/node_modules/@types/node/domain.d.ts +166 -0
  677. package/vendor/ink/node_modules/@types/node/events.d.ts +1054 -0
  678. package/vendor/ink/node_modules/@types/node/fs/promises.d.ts +1329 -0
  679. package/vendor/ink/node_modules/@types/node/fs.d.ts +4676 -0
  680. package/vendor/ink/node_modules/@types/node/globals.d.ts +150 -0
  681. package/vendor/ink/node_modules/@types/node/globals.typedarray.d.ts +101 -0
  682. package/vendor/ink/node_modules/@types/node/http.d.ts +2167 -0
  683. package/vendor/ink/node_modules/@types/node/http2.d.ts +2480 -0
  684. package/vendor/ink/node_modules/@types/node/https.d.ts +405 -0
  685. package/vendor/ink/node_modules/@types/node/index.d.ts +115 -0
  686. package/vendor/ink/node_modules/@types/node/inspector/promises.d.ts +41 -0
  687. package/vendor/ink/node_modules/@types/node/inspector.d.ts +224 -0
  688. package/vendor/ink/node_modules/@types/node/inspector.generated.d.ts +4226 -0
  689. package/vendor/ink/node_modules/@types/node/module.d.ts +819 -0
  690. package/vendor/ink/node_modules/@types/node/net.d.ts +933 -0
  691. package/vendor/ink/node_modules/@types/node/os.d.ts +507 -0
  692. package/vendor/ink/node_modules/@types/node/package.json +155 -0
  693. package/vendor/ink/node_modules/@types/node/path/posix.d.ts +8 -0
  694. package/vendor/ink/node_modules/@types/node/path/win32.d.ts +8 -0
  695. package/vendor/ink/node_modules/@types/node/path.d.ts +187 -0
  696. package/vendor/ink/node_modules/@types/node/perf_hooks.d.ts +643 -0
  697. package/vendor/ink/node_modules/@types/node/process.d.ts +2156 -0
  698. package/vendor/ink/node_modules/@types/node/punycode.d.ts +117 -0
  699. package/vendor/ink/node_modules/@types/node/querystring.d.ts +152 -0
  700. package/vendor/ink/node_modules/@types/node/quic.d.ts +910 -0
  701. package/vendor/ink/node_modules/@types/node/readline/promises.d.ts +161 -0
  702. package/vendor/ink/node_modules/@types/node/readline.d.ts +541 -0
  703. package/vendor/ink/node_modules/@types/node/repl.d.ts +415 -0
  704. package/vendor/ink/node_modules/@types/node/sea.d.ts +162 -0
  705. package/vendor/ink/node_modules/@types/node/sqlite.d.ts +955 -0
  706. package/vendor/ink/node_modules/@types/node/stream/consumers.d.ts +38 -0
  707. package/vendor/ink/node_modules/@types/node/stream/promises.d.ts +211 -0
  708. package/vendor/ink/node_modules/@types/node/stream/web.d.ts +296 -0
  709. package/vendor/ink/node_modules/@types/node/stream.d.ts +1760 -0
  710. package/vendor/ink/node_modules/@types/node/string_decoder.d.ts +67 -0
  711. package/vendor/ink/node_modules/@types/node/test/reporters.d.ts +96 -0
  712. package/vendor/ink/node_modules/@types/node/test.d.ts +2240 -0
  713. package/vendor/ink/node_modules/@types/node/timers/promises.d.ts +108 -0
  714. package/vendor/ink/node_modules/@types/node/timers.d.ts +159 -0
  715. package/vendor/ink/node_modules/@types/node/tls.d.ts +1198 -0
  716. package/vendor/ink/node_modules/@types/node/trace_events.d.ts +197 -0
  717. package/vendor/ink/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
  718. package/vendor/ink/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  719. package/vendor/ink/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
  720. package/vendor/ink/node_modules/@types/node/ts5.6/index.d.ts +117 -0
  721. package/vendor/ink/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  722. package/vendor/ink/node_modules/@types/node/ts5.7/index.d.ts +117 -0
  723. package/vendor/ink/node_modules/@types/node/tty.d.ts +250 -0
  724. package/vendor/ink/node_modules/@types/node/url.d.ts +519 -0
  725. package/vendor/ink/node_modules/@types/node/util/types.d.ts +558 -0
  726. package/vendor/ink/node_modules/@types/node/util.d.ts +1662 -0
  727. package/vendor/ink/node_modules/@types/node/v8.d.ts +983 -0
  728. package/vendor/ink/node_modules/@types/node/vm.d.ts +1208 -0
  729. package/vendor/ink/node_modules/@types/node/wasi.d.ts +202 -0
  730. package/vendor/ink/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
  731. package/vendor/ink/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  732. package/vendor/ink/node_modules/@types/node/web-globals/console.d.ts +9 -0
  733. package/vendor/ink/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  734. package/vendor/ink/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  735. package/vendor/ink/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  736. package/vendor/ink/node_modules/@types/node/web-globals/events.d.ts +106 -0
  737. package/vendor/ink/node_modules/@types/node/web-globals/fetch.d.ts +69 -0
  738. package/vendor/ink/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  739. package/vendor/ink/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  740. package/vendor/ink/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
  741. package/vendor/ink/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  742. package/vendor/ink/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  743. package/vendor/ink/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  744. package/vendor/ink/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  745. package/vendor/ink/node_modules/@types/node/web-globals/url.d.ts +24 -0
  746. package/vendor/ink/node_modules/@types/node/worker_threads.d.ts +717 -0
  747. package/vendor/ink/node_modules/@types/node/zlib.d.ts +618 -0
  748. package/vendor/ink/node_modules/node-pty/LICENSE +69 -0
  749. package/vendor/ink/node_modules/node-pty/README.md +164 -0
  750. package/vendor/ink/node_modules/node-pty/binding.gyp +150 -0
  751. package/vendor/ink/node_modules/node-pty/lib/conpty_console_list_agent.js +25 -0
  752. package/vendor/ink/node_modules/node-pty/lib/eventEmitter2.js +47 -0
  753. package/vendor/ink/node_modules/node-pty/lib/index.js +52 -0
  754. package/vendor/ink/node_modules/node-pty/lib/interfaces.js +7 -0
  755. package/vendor/ink/node_modules/node-pty/lib/shared/conout.js +11 -0
  756. package/vendor/ink/node_modules/node-pty/lib/terminal.js +190 -0
  757. package/vendor/ink/node_modules/node-pty/lib/types.js +7 -0
  758. package/vendor/ink/node_modules/node-pty/lib/unixTerminal.js +349 -0
  759. package/vendor/ink/node_modules/node-pty/lib/utils.js +39 -0
  760. package/vendor/ink/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
  761. package/vendor/ink/node_modules/node-pty/lib/windowsPtyAgent.js +287 -0
  762. package/vendor/ink/node_modules/node-pty/lib/windowsTerminal.js +201 -0
  763. package/vendor/ink/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  764. package/vendor/ink/node_modules/node-pty/package.json +65 -0
  765. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
  766. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
  767. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
  768. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
  769. package/vendor/ink/node_modules/node-pty/prebuilds/linux-arm64/pty.node +0 -0
  770. package/vendor/ink/node_modules/node-pty/prebuilds/linux-x64/pty.node +0 -0
  771. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  772. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  773. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  774. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
  775. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  776. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  777. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  778. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  779. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  780. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
  781. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  782. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  783. package/vendor/ink/node_modules/node-pty/scripts/post-install.js +76 -0
  784. package/vendor/ink/node_modules/node-pty/scripts/prebuild.js +34 -0
  785. package/vendor/ink/node_modules/node-pty/src/unix/pty.cc +875 -0
  786. package/vendor/ink/node_modules/node-pty/src/unix/spawn-helper.cc +23 -0
  787. package/vendor/ink/node_modules/node-pty/src/win/conpty.cc +582 -0
  788. package/vendor/ink/node_modules/node-pty/src/win/conpty.h +41 -0
  789. package/vendor/ink/node_modules/node-pty/src/win/conpty_console_list.cc +44 -0
  790. package/vendor/ink/node_modules/node-pty/src/win/path_util.cc +95 -0
  791. package/vendor/ink/node_modules/node-pty/src/win/path_util.h +26 -0
  792. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
  793. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
  794. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
  795. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
  796. package/vendor/ink/node_modules/node-pty/typings/node-pty.d.ts +215 -0
  797. package/vendor/ink/node_modules/undici-types/LICENSE +21 -0
  798. package/vendor/ink/node_modules/undici-types/README.md +6 -0
  799. package/vendor/ink/node_modules/undici-types/agent.d.ts +32 -0
  800. package/vendor/ink/node_modules/undici-types/api.d.ts +43 -0
  801. package/vendor/ink/node_modules/undici-types/balanced-pool.d.ts +30 -0
  802. package/vendor/ink/node_modules/undici-types/cache-interceptor.d.ts +173 -0
  803. package/vendor/ink/node_modules/undici-types/cache.d.ts +36 -0
  804. package/vendor/ink/node_modules/undici-types/client-stats.d.ts +15 -0
  805. package/vendor/ink/node_modules/undici-types/client.d.ts +108 -0
  806. package/vendor/ink/node_modules/undici-types/connector.d.ts +34 -0
  807. package/vendor/ink/node_modules/undici-types/content-type.d.ts +21 -0
  808. package/vendor/ink/node_modules/undici-types/cookies.d.ts +30 -0
  809. package/vendor/ink/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
  810. package/vendor/ink/node_modules/undici-types/dispatcher.d.ts +276 -0
  811. package/vendor/ink/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
  812. package/vendor/ink/node_modules/undici-types/errors.d.ts +161 -0
  813. package/vendor/ink/node_modules/undici-types/eventsource.d.ts +66 -0
  814. package/vendor/ink/node_modules/undici-types/fetch.d.ts +211 -0
  815. package/vendor/ink/node_modules/undici-types/formdata.d.ts +108 -0
  816. package/vendor/ink/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  817. package/vendor/ink/node_modules/undici-types/global-origin.d.ts +7 -0
  818. package/vendor/ink/node_modules/undici-types/h2c-client.d.ts +73 -0
  819. package/vendor/ink/node_modules/undici-types/handlers.d.ts +15 -0
  820. package/vendor/ink/node_modules/undici-types/header.d.ts +160 -0
  821. package/vendor/ink/node_modules/undici-types/index.d.ts +88 -0
  822. package/vendor/ink/node_modules/undici-types/interceptors.d.ts +73 -0
  823. package/vendor/ink/node_modules/undici-types/mock-agent.d.ts +68 -0
  824. package/vendor/ink/node_modules/undici-types/mock-call-history.d.ts +111 -0
  825. package/vendor/ink/node_modules/undici-types/mock-client.d.ts +27 -0
  826. package/vendor/ink/node_modules/undici-types/mock-errors.d.ts +12 -0
  827. package/vendor/ink/node_modules/undici-types/mock-interceptor.d.ts +94 -0
  828. package/vendor/ink/node_modules/undici-types/mock-pool.d.ts +27 -0
  829. package/vendor/ink/node_modules/undici-types/package.json +55 -0
  830. package/vendor/ink/node_modules/undici-types/patch.d.ts +29 -0
  831. package/vendor/ink/node_modules/undici-types/pool-stats.d.ts +19 -0
  832. package/vendor/ink/node_modules/undici-types/pool.d.ts +41 -0
  833. package/vendor/ink/node_modules/undici-types/proxy-agent.d.ts +29 -0
  834. package/vendor/ink/node_modules/undici-types/readable.d.ts +68 -0
  835. package/vendor/ink/node_modules/undici-types/retry-agent.d.ts +8 -0
  836. package/vendor/ink/node_modules/undici-types/retry-handler.d.ts +125 -0
  837. package/vendor/ink/node_modules/undici-types/round-robin-pool.d.ts +41 -0
  838. package/vendor/ink/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  839. package/vendor/ink/node_modules/undici-types/util.d.ts +18 -0
  840. package/vendor/ink/node_modules/undici-types/utility.d.ts +7 -0
  841. package/vendor/ink/node_modules/undici-types/webidl.d.ts +341 -0
  842. package/vendor/ink/node_modules/undici-types/websocket.d.ts +186 -0
  843. package/vendor/ink/package.json +201 -0
  844. package/vendor/ink/readme.md +2636 -0
  845. package/bin/swag-agent.js +0 -9
  846. package/dist/server/lib/pg-rate-limiter.d.ts +0 -21
  847. 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