@tyvm/knowhow 0.0.159 → 0.0.161

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 (906) hide show
  1. package/README.md +6 -6
  2. package/package.json +2 -2
  3. package/ts_build/package.json +2 -2
  4. package/ts_build/src/chat/CliChatService.d.ts +2 -1
  5. package/ts_build/src/chat/CliChatService.js +29 -3
  6. package/ts_build/src/chat/CliChatService.js.map +1 -1
  7. package/ts_build/src/chat/modules/AgentModule.js +21 -17
  8. package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
  9. package/ts_build/src/chat/renderer/ConsoleRenderer.js +32 -25
  10. package/ts_build/src/chat/renderer/ConsoleRenderer.js.map +1 -1
  11. package/ts_build/src/clients/anthropic.js +4 -1
  12. package/ts_build/src/clients/anthropic.js.map +1 -1
  13. package/ts_build/src/clients/contextLimits.js +13 -7
  14. package/ts_build/src/clients/contextLimits.js.map +1 -1
  15. package/ts_build/src/clients/index.js +3 -1
  16. package/ts_build/src/clients/index.js.map +1 -1
  17. package/ts_build/src/clients/openai.js +18 -5
  18. package/ts_build/src/clients/openai.js.map +1 -1
  19. package/ts_build/src/clients/pricing/anthropic.d.ts +2 -0
  20. package/ts_build/src/clients/pricing/anthropic.js +21 -1
  21. package/ts_build/src/clients/pricing/anthropic.js.map +1 -1
  22. package/ts_build/src/clients/pricing/openai.d.ts +2 -0
  23. package/ts_build/src/clients/pricing/openai.js +32 -7
  24. package/ts_build/src/clients/pricing/openai.js.map +1 -1
  25. package/ts_build/src/clients/pricing/types.d.ts +4 -0
  26. package/ts_build/src/clients/pricing/types.js.map +1 -1
  27. package/ts_build/src/clients/pricing/xai.d.ts +2 -0
  28. package/ts_build/src/clients/pricing/xai.js +13 -8
  29. package/ts_build/src/clients/pricing/xai.js.map +1 -1
  30. package/ts_build/src/clients/xai.js +20 -8
  31. package/ts_build/src/clients/xai.js.map +1 -1
  32. package/ts_build/src/commands/misc.js +15 -2
  33. package/ts_build/src/commands/misc.js.map +1 -1
  34. package/ts_build/src/logger.d.ts +1 -0
  35. package/ts_build/src/logger.js +13 -1
  36. package/ts_build/src/logger.js.map +1 -1
  37. package/ts_build/src/remotes.d.ts +2 -0
  38. package/ts_build/src/remotes.js +20 -2
  39. package/ts_build/src/remotes.js.map +1 -1
  40. package/ts_build/src/tunnel.js +7 -2
  41. package/ts_build/src/tunnel.js.map +1 -1
  42. package/ts_build/src/types.d.ts +12 -1
  43. package/ts_build/src/types.js.map +1 -1
  44. package/ts_build/src/utils/InputQueueManager.d.ts +8 -1
  45. package/ts_build/src/utils/InputQueueManager.js +74 -3
  46. package/ts_build/src/utils/InputQueueManager.js.map +1 -1
  47. package/ts_build/src/utils/index.d.ts +3 -1
  48. package/ts_build/src/utils/index.js +11 -3
  49. package/ts_build/src/utils/index.js.map +1 -1
  50. package/ts_build/src/worker.js +4 -1
  51. package/ts_build/src/worker.js.map +1 -1
  52. package/ts_build/src/workers/tools/listAllowedPorts.d.ts +2 -1
  53. package/ts_build/src/workers/tools/listAllowedPorts.js +1 -1
  54. package/ts_build/src/workers/tools/listAllowedPorts.js.map +1 -1
  55. package/CONFIG.md +0 -429
  56. package/PROCESSING.md +0 -450
  57. package/WORKER.md +0 -260
  58. package/autodoc/README.md +0 -324
  59. package/autodoc/chat-guide.md +0 -444
  60. package/autodoc/cli-reference.md +0 -720
  61. package/autodoc/config-reference.md +0 -642
  62. package/autodoc/embeddings-guide.md +0 -467
  63. package/autodoc/generate-guide.md +0 -437
  64. package/autodoc/language-plugin-guide.md +0 -417
  65. package/autodoc/modules-guide.md +0 -379
  66. package/autodoc/plugins-guide.md +0 -721
  67. package/autodoc/quickstart-guide.md +0 -126
  68. package/autodoc/skills-guide.md +0 -584
  69. package/autodoc/worker-guide.md +0 -519
  70. package/docs/input-queue-manager.md +0 -142
  71. package/docs/multi-worker-management.md +0 -142
  72. package/docs/shell-commands.md +0 -174
  73. package/jest.config.js +0 -19
  74. package/jest.manual.config.js +0 -19
  75. package/scripts/README.md +0 -119
  76. package/scripts/build-for-node.sh +0 -148
  77. package/scripts/cache-miss-debug.ts +0 -365
  78. package/scripts/check-isolated-deps.sh +0 -69
  79. package/scripts/check-model-pricing.ts +0 -509
  80. package/scripts/compare-openrouter-coverage.ts +0 -576
  81. package/scripts/migrate-usage-json.js +0 -147
  82. package/scripts/publish.sh +0 -86
  83. package/scripts/restore_keys.sh +0 -59
  84. package/scripts/test-repetition-hint.ts +0 -302
  85. package/scripts/unset_keys.sh +0 -60
  86. package/src/agents/base/base.ts +0 -1963
  87. package/src/agents/base/prompt.ts +0 -55
  88. package/src/agents/configurable/ConfigAgent.ts +0 -24
  89. package/src/agents/developer/developer.ts +0 -76
  90. package/src/agents/historyRollback.ts +0 -36
  91. package/src/agents/index.ts +0 -52
  92. package/src/agents/interface.ts +0 -11
  93. package/src/agents/patcher/codebase.md +0 -27
  94. package/src/agents/patcher/patcher.ts +0 -131
  95. package/src/agents/researcher/researcher.ts +0 -115
  96. package/src/agents/setup/setup.ts +0 -63
  97. package/src/agents/tools/addInternalTools.ts +0 -21
  98. package/src/agents/tools/agentCall.ts +0 -34
  99. package/src/agents/tools/aiClient.ts +0 -178
  100. package/src/agents/tools/askHuman.ts +0 -10
  101. package/src/agents/tools/callPlugin.ts +0 -10
  102. package/src/agents/tools/connectAgent.ts +0 -355
  103. package/src/agents/tools/embeddingSearch.ts +0 -6
  104. package/src/agents/tools/execCommand.ts +0 -162
  105. package/src/agents/tools/fileSearch.ts +0 -35
  106. package/src/agents/tools/finalAnswer.ts +0 -4
  107. package/src/agents/tools/googleSearch.ts +0 -243
  108. package/src/agents/tools/index.ts +0 -33
  109. package/src/agents/tools/language/definitions.ts +0 -105
  110. package/src/agents/tools/language/index.ts +0 -20
  111. package/src/agents/tools/lazy/definitions.ts +0 -72
  112. package/src/agents/tools/lazy/disableTools.ts +0 -16
  113. package/src/agents/tools/lazy/enableTools.ts +0 -16
  114. package/src/agents/tools/lazy/index.ts +0 -3
  115. package/src/agents/tools/lazy/listAvailableTools.ts +0 -17
  116. package/src/agents/tools/lintFile.ts +0 -19
  117. package/src/agents/tools/list.ts +0 -739
  118. package/src/agents/tools/loadImageAsBase64.ts +0 -83
  119. package/src/agents/tools/loadWebpage.ts +0 -19
  120. package/src/agents/tools/mcp/connectMcpServer.ts +0 -40
  121. package/src/agents/tools/mcp/definitions.ts +0 -67
  122. package/src/agents/tools/mcp/disconnectMcpServer.ts +0 -40
  123. package/src/agents/tools/mcp/index.ts +0 -3
  124. package/src/agents/tools/mcp/listAvailableMcpServers.ts +0 -28
  125. package/src/agents/tools/minimal/callTool.ts +0 -45
  126. package/src/agents/tools/minimal/definitions.ts +0 -50
  127. package/src/agents/tools/minimal/index.ts +0 -3
  128. package/src/agents/tools/minimal/inspectTools.ts +0 -27
  129. package/src/agents/tools/modifyFile.ts +0 -53
  130. package/src/agents/tools/observe.ts +0 -247
  131. package/src/agents/tools/patch.ts +0 -1287
  132. package/src/agents/tools/readBlocks.ts +0 -83
  133. package/src/agents/tools/readFile.ts +0 -105
  134. package/src/agents/tools/replyToParent.ts +0 -123
  135. package/src/agents/tools/runGenerate.ts +0 -210
  136. package/src/agents/tools/scanFile.ts +0 -16
  137. package/src/agents/tools/sendAgentMessage.ts +0 -139
  138. package/src/agents/tools/skills.ts +0 -79
  139. package/src/agents/tools/startAgentTask.ts +0 -393
  140. package/src/agents/tools/stringReplace.ts +0 -105
  141. package/src/agents/tools/textSearch.ts +0 -128
  142. package/src/agents/tools/types/fileblock.ts +0 -5
  143. package/src/agents/tools/visionTool.ts +0 -35
  144. package/src/agents/tools/waitForAgentCompleted.ts +0 -270
  145. package/src/agents/tools/writeFile.ts +0 -106
  146. package/src/agents/tools/ycmd/client.ts +0 -608
  147. package/src/agents/tools/ycmd/definitions.ts +0 -294
  148. package/src/agents/tools/ycmd/detection.ts +0 -211
  149. package/src/agents/tools/ycmd/index.ts +0 -11
  150. package/src/agents/tools/ycmd/installer.ts +0 -251
  151. package/src/agents/tools/ycmd/server.ts +0 -545
  152. package/src/agents/tools/ycmd/serverManager.ts +0 -316
  153. package/src/agents/tools/ycmd/tools/completion.ts +0 -113
  154. package/src/agents/tools/ycmd/tools/diagnostics.ts +0 -166
  155. package/src/agents/tools/ycmd/tools/getLocations.ts +0 -173
  156. package/src/agents/tools/ycmd/tools/goto.ts +0 -169
  157. package/src/agents/tools/ycmd/tools/refactor.ts +0 -204
  158. package/src/agents/tools/ycmd/tools/signature.ts +0 -174
  159. package/src/agents/tools/ycmd/tools/start.ts +0 -95
  160. package/src/agents/tools/ycmd/utils/pathUtils.ts +0 -59
  161. package/src/ai.ts +0 -306
  162. package/src/auth/browserLogin.ts +0 -406
  163. package/src/auth/environmentAuth.ts +0 -51
  164. package/src/auth/errors.ts +0 -6
  165. package/src/auth/jwtStore.ts +0 -70
  166. package/src/auth/keyAuth.ts +0 -142
  167. package/src/auth/keyManager.ts +0 -331
  168. package/src/auth/registerIdentity.ts +0 -67
  169. package/src/auth/spinner.ts +0 -23
  170. package/src/chat/CliChatService.ts +0 -438
  171. package/src/chat/modules/AgentModule.ts +0 -1664
  172. package/src/chat/modules/AskModule.ts +0 -98
  173. package/src/chat/modules/BaseChatModule.ts +0 -65
  174. package/src/chat/modules/ClipboardImageModule.ts +0 -136
  175. package/src/chat/modules/CustomCommandsModule.ts +0 -80
  176. package/src/chat/modules/InternalChatModule.ts +0 -216
  177. package/src/chat/modules/RemoteSyncModule.ts +0 -482
  178. package/src/chat/modules/RendererModule.ts +0 -139
  179. package/src/chat/modules/SearchModule.ts +0 -168
  180. package/src/chat/modules/SessionsModule.ts +0 -969
  181. package/src/chat/modules/SetupModule.ts +0 -185
  182. package/src/chat/modules/ShellCommandModule.ts +0 -98
  183. package/src/chat/modules/SystemModule.ts +0 -161
  184. package/src/chat/modules/ToolCommandModule.ts +0 -102
  185. package/src/chat/modules/VoiceModule.ts +0 -70
  186. package/src/chat/modules/index.ts +0 -8
  187. package/src/chat/renderer/CompactRenderer.ts +0 -229
  188. package/src/chat/renderer/ConsoleRenderer.ts +0 -160
  189. package/src/chat/renderer/FancyRenderer.ts +0 -440
  190. package/src/chat/renderer/PlainRenderer.ts +0 -218
  191. package/src/chat/renderer/index.ts +0 -6
  192. package/src/chat/renderer/loadRenderer.ts +0 -316
  193. package/src/chat/renderer/messagesToRenderEvents.ts +0 -96
  194. package/src/chat/renderer/types.ts +0 -99
  195. package/src/chat/types.ts +0 -146
  196. package/src/chat.ts +0 -140
  197. package/src/cli.ts +0 -180
  198. package/src/clients/anthropic.ts +0 -772
  199. package/src/clients/attribution.ts +0 -53
  200. package/src/clients/cerebras.ts +0 -10
  201. package/src/clients/contextLimits.ts +0 -263
  202. package/src/clients/copilot.ts +0 -23
  203. package/src/clients/deepseek.ts +0 -16
  204. package/src/clients/fireworks.ts +0 -71
  205. package/src/clients/gemini.ts +0 -1169
  206. package/src/clients/github.ts +0 -16
  207. package/src/clients/groq.ts +0 -15
  208. package/src/clients/http.ts +0 -719
  209. package/src/clients/index.ts +0 -1153
  210. package/src/clients/knowhow.ts +0 -130
  211. package/src/clients/knowhowMcp.ts +0 -118
  212. package/src/clients/llama.ts +0 -16
  213. package/src/clients/meta.ts +0 -27
  214. package/src/clients/mistral.ts +0 -16
  215. package/src/clients/nvidia.ts +0 -16
  216. package/src/clients/openai.ts +0 -1186
  217. package/src/clients/openrouter.ts +0 -24
  218. package/src/clients/pricing/anthropic.ts +0 -149
  219. package/src/clients/pricing/cerebras.ts +0 -11
  220. package/src/clients/pricing/copilot.ts +0 -60
  221. package/src/clients/pricing/deepseek.ts +0 -15
  222. package/src/clients/pricing/fireworks.ts +0 -182
  223. package/src/clients/pricing/github.ts +0 -69
  224. package/src/clients/pricing/google.ts +0 -385
  225. package/src/clients/pricing/groq.ts +0 -56
  226. package/src/clients/pricing/index.ts +0 -44
  227. package/src/clients/pricing/llama.ts +0 -18
  228. package/src/clients/pricing/meta.ts +0 -12
  229. package/src/clients/pricing/mistral.ts +0 -34
  230. package/src/clients/pricing/models.ts +0 -25
  231. package/src/clients/pricing/nvidia.ts +0 -102
  232. package/src/clients/pricing/openai.ts +0 -409
  233. package/src/clients/pricing/openrouter.ts +0 -36
  234. package/src/clients/pricing/qwen.ts +0 -80
  235. package/src/clients/pricing/types.ts +0 -125
  236. package/src/clients/pricing/xai.ts +0 -137
  237. package/src/clients/qwen.ts +0 -16
  238. package/src/clients/responseMetadata.ts +0 -221
  239. package/src/clients/types.ts +0 -531
  240. package/src/clients/withRetry.ts +0 -89
  241. package/src/clients/xai.ts +0 -693
  242. package/src/cloudWorker.ts +0 -394
  243. package/src/commands/agent.ts +0 -342
  244. package/src/commands/agents.ts +0 -1037
  245. package/src/commands/behaviors.ts +0 -47
  246. package/src/commands/convert.ts +0 -291
  247. package/src/commands/hash.ts +0 -179
  248. package/src/commands/mcp.ts +0 -743
  249. package/src/commands/misc.ts +0 -373
  250. package/src/commands/modules.ts +0 -704
  251. package/src/commands/processes.ts +0 -248
  252. package/src/commands/remote.ts +0 -77
  253. package/src/commands/replay.ts +0 -503
  254. package/src/commands/sandbox.ts +0 -566
  255. package/src/commands/services.ts +0 -168
  256. package/src/commands/skills.ts +0 -107
  257. package/src/commands/workers.ts +0 -168
  258. package/src/config.ts +0 -468
  259. package/src/conversion.ts +0 -69
  260. package/src/dataset/diffs/README.md +0 -12
  261. package/src/dataset/diffs/debug-errors.ts +0 -29
  262. package/src/dataset/diffs/debug.ts +0 -64
  263. package/src/dataset/diffs/generate.ts +0 -71
  264. package/src/dataset/diffs/jsonl.ts +0 -53
  265. package/src/dataset/diffs/test.ts +0 -194
  266. package/src/embeddings.ts +0 -494
  267. package/src/fileSync.ts +0 -369
  268. package/src/generate.ts +0 -529
  269. package/src/hashes.ts +0 -180
  270. package/src/index.ts +0 -261
  271. package/src/logger.ts +0 -197
  272. package/src/login.ts +0 -209
  273. package/src/microphone.ts +0 -141
  274. package/src/migrations.ts +0 -151
  275. package/src/plugins/AgentsMdPlugin.ts +0 -118
  276. package/src/plugins/GitPlugin.ts +0 -598
  277. package/src/plugins/LinterPlugin.ts +0 -214
  278. package/src/plugins/PluginBase.ts +0 -70
  279. package/src/plugins/SkillsPlugin.ts +0 -37
  280. package/src/plugins/embedding.ts +0 -82
  281. package/src/plugins/exec.ts +0 -70
  282. package/src/plugins/language.ts +0 -290
  283. package/src/plugins/plugins.ts +0 -175
  284. package/src/plugins/tmux.ts +0 -132
  285. package/src/plugins/types.ts +0 -36
  286. package/src/plugins/url.ts +0 -101
  287. package/src/plugins/vim.ts +0 -89
  288. package/src/processes/ProcessManager.ts +0 -96
  289. package/src/processes/managedProcessShim.ts +0 -138
  290. package/src/processors/Base64ImageDetector.ts +0 -502
  291. package/src/processors/CustomVariables.ts +0 -693
  292. package/src/processors/GemmaToolProcessor.ts +0 -163
  293. package/src/processors/HarmonyToolProcessor.ts +0 -264
  294. package/src/processors/JsonCompressor.ts +0 -510
  295. package/src/processors/MinimalToolsMessageProcessor.ts +0 -113
  296. package/src/processors/TokenCompressor.ts +0 -620
  297. package/src/processors/ToolResponseCache.ts +0 -322
  298. package/src/processors/XmlToolCallProcessor.ts +0 -533
  299. package/src/processors/index.ts +0 -14
  300. package/src/processors/tools/boundedToolResponse.ts +0 -49
  301. package/src/processors/tools/grepToolResponse.ts +0 -230
  302. package/src/processors/tools/index.ts +0 -23
  303. package/src/processors/tools/jqToolResponse.ts +0 -159
  304. package/src/processors/tools/listStoredToolResponses.ts +0 -124
  305. package/src/processors/tools/tailToolResponse.ts +0 -148
  306. package/src/prompts/BasicCodeDocumenter.ts +0 -1
  307. package/src/prompts/BasicProjectDocumenter.ts +0 -1
  308. package/src/prompts/EmbeddingSeachHelper.ts +0 -1
  309. package/src/prompts/KnowhowConfigExamples.ts +0 -376
  310. package/src/prompts/index.ts +0 -9
  311. package/src/remotes.ts +0 -110
  312. package/src/server/index.ts +0 -16
  313. package/src/services/AgentService.ts +0 -134
  314. package/src/services/AgentSyncFs.ts +0 -775
  315. package/src/services/AgentSyncKnowhowWeb.ts +0 -389
  316. package/src/services/BehaviorsService.ts +0 -466
  317. package/src/services/DockerService.ts +0 -511
  318. package/src/services/EmbeddingService.ts +0 -427
  319. package/src/services/EmbeddingsService.ts +0 -73
  320. package/src/services/EventService.ts +0 -279
  321. package/src/services/ExtensionsService.ts +0 -25
  322. package/src/services/KnowhowClient.ts +0 -928
  323. package/src/services/LazyToolsService.ts +0 -210
  324. package/src/services/Mcp.ts +0 -727
  325. package/src/services/McpServer.ts +0 -155
  326. package/src/services/McpWebsocketTransport.ts +0 -87
  327. package/src/services/MediaProcessorService.ts +0 -669
  328. package/src/services/MessageProcessor.ts +0 -114
  329. package/src/services/MinimalToolsService.ts +0 -177
  330. package/src/services/RuntimeReloadService.ts +0 -31
  331. package/src/services/S3.ts +0 -61
  332. package/src/services/SessionManager.ts +0 -358
  333. package/src/services/SkillsService.ts +0 -822
  334. package/src/services/SyncedAgentWatcher.ts +0 -124
  335. package/src/services/SyncerService.ts +0 -191
  336. package/src/services/TaskRegistry.ts +0 -110
  337. package/src/services/Tools.ts +0 -580
  338. package/src/services/TracingService.ts +0 -116
  339. package/src/services/conversion/ConversionService.ts +0 -757
  340. package/src/services/conversion/index.ts +0 -2
  341. package/src/services/conversion/types.ts +0 -87
  342. package/src/services/flags.ts +0 -51
  343. package/src/services/index.ts +0 -117
  344. package/src/services/modules/computerUse.ts +0 -218
  345. package/src/services/modules/index.ts +0 -314
  346. package/src/services/modules/types.ts +0 -109
  347. package/src/services/types.ts +0 -60
  348. package/src/services/watchers/FsSyncer.ts +0 -199
  349. package/src/services/watchers/RemoteSyncer.ts +0 -196
  350. package/src/services/watchers/index.ts +0 -2
  351. package/src/tunnel.ts +0 -243
  352. package/src/types.ts +0 -282
  353. package/src/util/Trace.ts +0 -236
  354. package/src/utils/InputQueueManager.ts +0 -493
  355. package/src/utils/errors.ts +0 -0
  356. package/src/utils/http.ts +0 -150
  357. package/src/utils/index.ts +0 -111
  358. package/src/worker.ts +0 -696
  359. package/src/workerRegistry.ts +0 -152
  360. package/src/workers/auth/PasskeySetup.ts +0 -181
  361. package/src/workers/auth/WorkerPasskeyAuth.ts +0 -190
  362. package/src/workers/auth/WsMiddleware.ts +0 -99
  363. package/src/workers/auth/authMiddleware.ts +0 -104
  364. package/src/workers/auth/types.ts +0 -70
  365. package/src/workers/tools/getChallenge.ts +0 -33
  366. package/src/workers/tools/index.ts +0 -20
  367. package/src/workers/tools/listAllowedPorts.ts +0 -30
  368. package/src/workers/tools/lock.ts +0 -31
  369. package/src/workers/tools/reloadConfig.ts +0 -84
  370. package/src/workers/tools/unlock.ts +0 -116
  371. package/tests/XmlToolCallProcessor.test.ts +0 -468
  372. package/tests/agents/interrupt.test.ts +0 -200
  373. package/tests/agents/observe-base.test.ts +0 -183
  374. package/tests/agents/tools/connectAgent.test.ts +0 -138
  375. package/tests/agents/tools/observe.test.ts +0 -179
  376. package/tests/agents/tools/readFile.test.ts +0 -88
  377. package/tests/agents/tools/replyToParent.test.ts +0 -125
  378. package/tests/agents/tools/sendAgentMessage.test.ts +0 -99
  379. package/tests/agents/tools/waitForAgentCompleted.test.ts +0 -147
  380. package/tests/chat/detach-attach-rendering.test.ts +0 -315
  381. package/tests/clients/AIClient.test.ts +0 -668
  382. package/tests/clients/anthropic.test.ts +0 -202
  383. package/tests/clients/contextLimits.test.ts +0 -97
  384. package/tests/clients/fireworks.test.ts +0 -65
  385. package/tests/clients/openai.images.test.ts +0 -105
  386. package/tests/clients/pricing.test.ts +0 -206
  387. package/tests/clients/reasoningEffort.test.ts +0 -140
  388. package/tests/compressor/bigstring.test.ts +0 -450
  389. package/tests/compressor/bigstring.txt +0 -1
  390. package/tests/compressor/githubjson.txt +0 -1
  391. package/tests/compressor/toolResponseCache.test.ts +0 -304
  392. package/tests/compressor/usageBase64.json +0 -159
  393. package/tests/compressor/usageBase64.test.ts +0 -175
  394. package/tests/fixtures/fake-secret.txt +0 -1
  395. package/tests/manual/agent-events/run-test.ts +0 -203
  396. package/tests/manual/browser-login/README.md +0 -189
  397. package/tests/manual/browser-login/test_browser_login_basic.ts +0 -115
  398. package/tests/manual/browser-login/test_cli_integration.ts +0 -169
  399. package/tests/manual/browser-login/test_cross_platform_browser.ts +0 -186
  400. package/tests/manual/browser-login/test_error_scenarios.ts +0 -223
  401. package/tests/manual/cli/no-env.sh +0 -274
  402. package/tests/manual/clients/completions.json +0 -1151
  403. package/tests/manual/clients/completions.test.ts +0 -198
  404. package/tests/manual/file-edits/figma.test.ts +0 -3
  405. package/tests/manual/file-edits/fileblocks/readwrite.test.ts +0 -100
  406. package/tests/manual/file-edits/patching/input.txt +0 -145
  407. package/tests/manual/file-edits/patching/output.txt +0 -145
  408. package/tests/manual/file-edits/patching/patch.txt +0 -15
  409. package/tests/manual/file-edits/patching/unseen.txt +0 -80
  410. package/tests/manual/file-edits/patching.test.ts +0 -139
  411. package/tests/manual/modalities/README.md +0 -157
  412. package/tests/manual/modalities/google.modalities.test.ts +0 -335
  413. package/tests/manual/modalities/openai.modalities.test.ts +0 -329
  414. package/tests/manual/modalities/streaming.test.ts +0 -260
  415. package/tests/manual/modalities/xai.modalities.test.ts +0 -294
  416. package/tests/manual/test-concurrent-ask.ts +0 -43
  417. package/tests/manual/ycmd/debug_diagnostics_test.ts +0 -127
  418. package/tests/manual/ycmd/fixtures/debug_diagnostics.ts +0 -26
  419. package/tests/manual/ycmd/fixtures/file_change_test.ts +0 -17
  420. package/tests/manual/ycmd/minimal_advanced_test.ts +0 -108
  421. package/tests/manual/ycmd/simple_diagnostics_test.ts +0 -61
  422. package/tests/manual/ycmd/simple_test.ts +0 -74
  423. package/tests/manual/ycmd/test-typescript-sample.ts +0 -34
  424. package/tests/manual/ycmd/test_advanced_features.ts +0 -407
  425. package/tests/manual/ycmd/test_advanced_with_tools.ts +0 -320
  426. package/tests/manual/ycmd/test_comprehensive_typescript.ts +0 -179
  427. package/tests/manual/ycmd/test_diagnostics_file_changes.ts +0 -249
  428. package/tests/manual/ycmd/test_diagnostics_fix.ts +0 -99
  429. package/tests/manual/ycmd/test_diagnostics_simple.ts +0 -100
  430. package/tests/manual/ycmd/test_diagnostics_timing.ts +0 -120
  431. package/tests/manual/ycmd/test_discover_commands.ts +0 -310
  432. package/tests/manual/ycmd/test_endpoints.ts +0 -115
  433. package/tests/manual/ycmd/test_final_comprehensive.ts +0 -218
  434. package/tests/manual/ycmd/test_final_validation.ts +0 -150
  435. package/tests/manual/ycmd/test_implementation.js +0 -42
  436. package/tests/manual/ycmd/test_individual_ycmd_tool.ts +0 -39
  437. package/tests/manual/ycmd/test_server_manager.ts +0 -52
  438. package/tests/manual/ycmd/test_simple_debug.ts +0 -86
  439. package/tests/manual/ycmd/test_tsserver_workflow.js +0 -83
  440. package/tests/manual/ycmd/test_tsserver_workflow.ts +0 -122
  441. package/tests/manual/ycmd/test_typescript_simple.ts +0 -48
  442. package/tests/manual/ycmd/test_typescript_ycmd.ts +0 -105
  443. package/tests/manual/ycmd/test_workspace_config.ts +0 -90
  444. package/tests/manual/ycmd/test_ycmd_auto_start.ts +0 -137
  445. package/tests/manual/ycmd/test_ycmd_comprehensive.ts +0 -73
  446. package/tests/manual/ycmd/test_ycmd_connection.py +0 -10
  447. package/tests/manual/ycmd/test_ycmd_direct.ts +0 -142
  448. package/tests/manual/ycmd/test_ycmd_experiment.ts +0 -48
  449. package/tests/manual/ycmd/test_ycmd_final.ts +0 -200
  450. package/tests/manual/ycmd/test_ycmd_fixed.py +0 -18
  451. package/tests/manual/ycmd/test_ycmd_integration.ts +0 -112
  452. package/tests/manual/ycmd/test_ycmd_simple.ts +0 -45
  453. package/tests/manual/ycmd/test_ycmd_usage.py +0 -27
  454. package/tests/manual/ycmd/working_simple_test.ts +0 -134
  455. package/tests/patching/corrupted.test.ts +0 -78
  456. package/tests/patching/fixtures/transcript-mangles/agent-sync-fs-nested-catch.json +0 -9
  457. package/tests/patching/fixtures/transcript-mangles/automation-functions-crossed.json +0 -9
  458. package/tests/patching/fixtures/transcript-mangles/fruit-ninja-confirmed-retirement.json +0 -8
  459. package/tests/patching/imports.patch.txt +0 -11
  460. package/tests/patching/imports.test.ts +0 -43
  461. package/tests/patching/imports.txt +0 -11
  462. package/tests/patching/interface.patch.txt +0 -15
  463. package/tests/patching/interface.txt +0 -7
  464. package/tests/patching/patchFileOutput.test.ts +0 -328
  465. package/tests/patching/regression-2026.test.ts +0 -752
  466. package/tests/patching/transcriptMangleRegression.test.ts +0 -125
  467. package/tests/plugins/language/languagePlugin-content-triggers.test.ts +0 -346
  468. package/tests/plugins/language/languagePlugin-integration.test.ts +0 -471
  469. package/tests/plugins/language/languagePlugin.test.ts +0 -385
  470. package/tests/processes/managedProcessShim.test.ts +0 -59
  471. package/tests/processors/Base64ImageDetector.test.ts +0 -979
  472. package/tests/processors/CustomVariables.test.ts +0 -981
  473. package/tests/processors/CustomVariablesBenchmark.test.ts +0 -237
  474. package/tests/processors/HarmonyToolProcessor.test.ts +0 -490
  475. package/tests/processors/TokenCompressor.test.ts +0 -674
  476. package/tests/processors/ToolResponseCache.test.ts +0 -864
  477. package/tests/processors/tools/boundedRetrievalTools.test.ts +0 -68
  478. package/tests/processors/tools/grepToolResponse.test.ts +0 -159
  479. package/tests/services/ConversionService.test.ts +0 -154
  480. package/tests/services/DockerService.test.ts +0 -24
  481. package/tests/services/Tools.test.ts +0 -1738
  482. package/tests/services/ToolsService.setFunction.test.ts +0 -68
  483. package/tests/services/WorkerReloadConfig.test.ts +0 -141
  484. package/tests/test.spec.ts +0 -163
  485. package/tests/unit/InputQueueManager.test.ts +0 -174
  486. package/tests/unit/McpWebsocketTransport.test.ts +0 -56
  487. package/tests/unit/agents/historyRollback.test.ts +0 -53
  488. package/tests/unit/agents/tools/loadImageAsBase64.test.ts +0 -44
  489. package/tests/unit/auth/jwtStore.test.ts +0 -55
  490. package/tests/unit/auth/keyAuth.test.ts +0 -152
  491. package/tests/unit/auth/keyManager.test.ts +0 -130
  492. package/tests/unit/auth/registerIdentity.test.ts +0 -99
  493. package/tests/unit/chat/ToolCommandModule.test.ts +0 -71
  494. package/tests/unit/chat/historyCommandArgs.test.ts +0 -37
  495. package/tests/unit/clients/AIClient.test.ts +0 -454
  496. package/tests/unit/clients/anthropic.responseMetadata.test.ts +0 -81
  497. package/tests/unit/clients/attribution.test.ts +0 -185
  498. package/tests/unit/clients/http.responseMetadata.test.ts +0 -86
  499. package/tests/unit/clients/openai.responseMetadata.test.ts +0 -90
  500. package/tests/unit/clients/responseMetadata.test.ts +0 -123
  501. package/tests/unit/clients/withRetry.test.ts +0 -319
  502. package/tests/unit/commands/agents.test.ts +0 -111
  503. package/tests/unit/commands/github-credentials.test.ts +0 -210
  504. package/tests/unit/commands/misc.test.ts +0 -85
  505. package/tests/unit/commands/remote.test.ts +0 -79
  506. package/tests/unit/commands/sandbox.test.ts +0 -350
  507. package/tests/unit/hashes.test.ts +0 -23
  508. package/tests/unit/input-queue.test.ts +0 -80
  509. package/tests/unit/login.test.ts +0 -218
  510. package/tests/unit/modules/moduleLoading.test.ts +0 -305
  511. package/tests/unit/plugins/pluginLoading.test.ts +0 -97
  512. package/tests/unit/services/AgentSyncKnowhowWeb.test.ts +0 -38
  513. package/tests/unit/services/KnowhowClient.test.ts +0 -84
  514. package/tests/unit/services/LazyToolsService.test.ts +0 -53
  515. package/tests/unit/services/Mcp.test.ts +0 -56
  516. package/tests/unit/services/MinimalToolsService.test.ts +0 -424
  517. package/tests/unit/services/RuntimeReloadService.test.ts +0 -29
  518. package/tests/unit/services/SessionManager.test.ts +0 -43
  519. package/tests/unit/services/SyncedAgentWatcher.test.ts +0 -89
  520. package/tests/unit/services/SyncerService.test.ts +0 -45
  521. package/tests/unit/tunnel.test.ts +0 -51
  522. package/tests/unit/util/Trace.test.ts +0 -119
  523. package/tests/unit/utils/http.test.ts +0 -43
  524. package/ts_build/tests/XmlToolCallProcessor.test.d.ts +0 -1
  525. package/ts_build/tests/XmlToolCallProcessor.test.js +0 -376
  526. package/ts_build/tests/XmlToolCallProcessor.test.js.map +0 -1
  527. package/ts_build/tests/agents/interrupt.test.d.ts +0 -14
  528. package/ts_build/tests/agents/interrupt.test.js +0 -136
  529. package/ts_build/tests/agents/interrupt.test.js.map +0 -1
  530. package/ts_build/tests/agents/observe-base.test.d.ts +0 -1
  531. package/ts_build/tests/agents/observe-base.test.js +0 -149
  532. package/ts_build/tests/agents/observe-base.test.js.map +0 -1
  533. package/ts_build/tests/agents/tools/connectAgent.test.d.ts +0 -1
  534. package/ts_build/tests/agents/tools/connectAgent.test.js +0 -142
  535. package/ts_build/tests/agents/tools/connectAgent.test.js.map +0 -1
  536. package/ts_build/tests/agents/tools/observe.test.d.ts +0 -1
  537. package/ts_build/tests/agents/tools/observe.test.js +0 -148
  538. package/ts_build/tests/agents/tools/observe.test.js.map +0 -1
  539. package/ts_build/tests/agents/tools/readFile.test.d.ts +0 -1
  540. package/ts_build/tests/agents/tools/readFile.test.js +0 -90
  541. package/ts_build/tests/agents/tools/readFile.test.js.map +0 -1
  542. package/ts_build/tests/agents/tools/replyToParent.test.d.ts +0 -1
  543. package/ts_build/tests/agents/tools/replyToParent.test.js +0 -116
  544. package/ts_build/tests/agents/tools/replyToParent.test.js.map +0 -1
  545. package/ts_build/tests/agents/tools/sendAgentMessage.test.d.ts +0 -1
  546. package/ts_build/tests/agents/tools/sendAgentMessage.test.js +0 -112
  547. package/ts_build/tests/agents/tools/sendAgentMessage.test.js.map +0 -1
  548. package/ts_build/tests/agents/tools/waitForAgentCompleted.test.d.ts +0 -1
  549. package/ts_build/tests/agents/tools/waitForAgentCompleted.test.js +0 -147
  550. package/ts_build/tests/agents/tools/waitForAgentCompleted.test.js.map +0 -1
  551. package/ts_build/tests/chat/detach-attach-rendering.test.d.ts +0 -1
  552. package/ts_build/tests/chat/detach-attach-rendering.test.js +0 -168
  553. package/ts_build/tests/chat/detach-attach-rendering.test.js.map +0 -1
  554. package/ts_build/tests/clients/AIClient.test.d.ts +0 -1
  555. package/ts_build/tests/clients/AIClient.test.js +0 -483
  556. package/ts_build/tests/clients/AIClient.test.js.map +0 -1
  557. package/ts_build/tests/clients/anthropic.test.d.ts +0 -1
  558. package/ts_build/tests/clients/anthropic.test.js +0 -159
  559. package/ts_build/tests/clients/anthropic.test.js.map +0 -1
  560. package/ts_build/tests/clients/contextLimits.test.d.ts +0 -1
  561. package/ts_build/tests/clients/contextLimits.test.js +0 -69
  562. package/ts_build/tests/clients/contextLimits.test.js.map +0 -1
  563. package/ts_build/tests/clients/fireworks.test.d.ts +0 -1
  564. package/ts_build/tests/clients/fireworks.test.js +0 -65
  565. package/ts_build/tests/clients/fireworks.test.js.map +0 -1
  566. package/ts_build/tests/clients/openai.images.test.d.ts +0 -1
  567. package/ts_build/tests/clients/openai.images.test.js +0 -94
  568. package/ts_build/tests/clients/openai.images.test.js.map +0 -1
  569. package/ts_build/tests/clients/pricing.test.d.ts +0 -1
  570. package/ts_build/tests/clients/pricing.test.js +0 -124
  571. package/ts_build/tests/clients/pricing.test.js.map +0 -1
  572. package/ts_build/tests/clients/reasoningEffort.test.d.ts +0 -1
  573. package/ts_build/tests/clients/reasoningEffort.test.js +0 -116
  574. package/ts_build/tests/clients/reasoningEffort.test.js.map +0 -1
  575. package/ts_build/tests/compressor/bigstring.test.d.ts +0 -1
  576. package/ts_build/tests/compressor/bigstring.test.js +0 -275
  577. package/ts_build/tests/compressor/bigstring.test.js.map +0 -1
  578. package/ts_build/tests/compressor/toolResponseCache.test.d.ts +0 -1
  579. package/ts_build/tests/compressor/toolResponseCache.test.js +0 -250
  580. package/ts_build/tests/compressor/toolResponseCache.test.js.map +0 -1
  581. package/ts_build/tests/compressor/usageBase64.test.d.ts +0 -1
  582. package/ts_build/tests/compressor/usageBase64.test.js +0 -109
  583. package/ts_build/tests/compressor/usageBase64.test.js.map +0 -1
  584. package/ts_build/tests/manual/agent-events/run-test.d.ts +0 -2
  585. package/ts_build/tests/manual/agent-events/run-test.js +0 -148
  586. package/ts_build/tests/manual/agent-events/run-test.js.map +0 -1
  587. package/ts_build/tests/manual/browser-login/test_browser_login_basic.d.ts +0 -2
  588. package/ts_build/tests/manual/browser-login/test_browser_login_basic.js +0 -118
  589. package/ts_build/tests/manual/browser-login/test_browser_login_basic.js.map +0 -1
  590. package/ts_build/tests/manual/browser-login/test_cli_integration.d.ts +0 -2
  591. package/ts_build/tests/manual/browser-login/test_cli_integration.js +0 -163
  592. package/ts_build/tests/manual/browser-login/test_cli_integration.js.map +0 -1
  593. package/ts_build/tests/manual/browser-login/test_cross_platform_browser.d.ts +0 -2
  594. package/ts_build/tests/manual/browser-login/test_cross_platform_browser.js +0 -169
  595. package/ts_build/tests/manual/browser-login/test_cross_platform_browser.js.map +0 -1
  596. package/ts_build/tests/manual/browser-login/test_error_scenarios.d.ts +0 -2
  597. package/ts_build/tests/manual/browser-login/test_error_scenarios.js +0 -207
  598. package/ts_build/tests/manual/browser-login/test_error_scenarios.js.map +0 -1
  599. package/ts_build/tests/manual/clients/completions.test.d.ts +0 -1
  600. package/ts_build/tests/manual/clients/completions.test.js +0 -151
  601. package/ts_build/tests/manual/clients/completions.test.js.map +0 -1
  602. package/ts_build/tests/manual/file-edits/figma.test.d.ts +0 -0
  603. package/ts_build/tests/manual/file-edits/figma.test.js +0 -2
  604. package/ts_build/tests/manual/file-edits/figma.test.js.map +0 -1
  605. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.d.ts +0 -1
  606. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js +0 -110
  607. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js.map +0 -1
  608. package/ts_build/tests/manual/file-edits/patching.test.d.ts +0 -1
  609. package/ts_build/tests/manual/file-edits/patching.test.js +0 -129
  610. package/ts_build/tests/manual/file-edits/patching.test.js.map +0 -1
  611. package/ts_build/tests/manual/modalities/google.modalities.test.d.ts +0 -1
  612. package/ts_build/tests/manual/modalities/google.modalities.test.js +0 -262
  613. package/ts_build/tests/manual/modalities/google.modalities.test.js.map +0 -1
  614. package/ts_build/tests/manual/modalities/openai.modalities.test.d.ts +0 -1
  615. package/ts_build/tests/manual/modalities/openai.modalities.test.js +0 -262
  616. package/ts_build/tests/manual/modalities/openai.modalities.test.js.map +0 -1
  617. package/ts_build/tests/manual/modalities/streaming.test.d.ts +0 -1
  618. package/ts_build/tests/manual/modalities/streaming.test.js +0 -216
  619. package/ts_build/tests/manual/modalities/streaming.test.js.map +0 -1
  620. package/ts_build/tests/manual/modalities/xai.modalities.test.d.ts +0 -1
  621. package/ts_build/tests/manual/modalities/xai.modalities.test.js +0 -219
  622. package/ts_build/tests/manual/modalities/xai.modalities.test.js.map +0 -1
  623. package/ts_build/tests/manual/test-concurrent-ask.d.ts +0 -1
  624. package/ts_build/tests/manual/test-concurrent-ask.js +0 -22
  625. package/ts_build/tests/manual/test-concurrent-ask.js.map +0 -1
  626. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.d.ts +0 -1
  627. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js +0 -124
  628. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js.map +0 -1
  629. package/ts_build/tests/manual/ycmd/minimal_advanced_test.d.ts +0 -2
  630. package/ts_build/tests/manual/ycmd/minimal_advanced_test.js +0 -114
  631. package/ts_build/tests/manual/ycmd/minimal_advanced_test.js.map +0 -1
  632. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.d.ts +0 -1
  633. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js +0 -84
  634. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js.map +0 -1
  635. package/ts_build/tests/manual/ycmd/simple_test.d.ts +0 -2
  636. package/ts_build/tests/manual/ycmd/simple_test.js +0 -92
  637. package/ts_build/tests/manual/ycmd/simple_test.js.map +0 -1
  638. package/ts_build/tests/manual/ycmd/test-typescript-sample.d.ts +0 -14
  639. package/ts_build/tests/manual/ycmd/test-typescript-sample.js +0 -20
  640. package/ts_build/tests/manual/ycmd/test-typescript-sample.js.map +0 -1
  641. package/ts_build/tests/manual/ycmd/test_advanced_features.d.ts +0 -2
  642. package/ts_build/tests/manual/ycmd/test_advanced_features.js +0 -306
  643. package/ts_build/tests/manual/ycmd/test_advanced_features.js.map +0 -1
  644. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.d.ts +0 -3
  645. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js +0 -271
  646. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js.map +0 -1
  647. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.d.ts +0 -2
  648. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js +0 -196
  649. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js.map +0 -1
  650. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.d.ts +0 -1
  651. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js +0 -184
  652. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js.map +0 -1
  653. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.d.ts +0 -2
  654. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js +0 -116
  655. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js.map +0 -1
  656. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.d.ts +0 -1
  657. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js +0 -114
  658. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js.map +0 -1
  659. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.d.ts +0 -1
  660. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js +0 -129
  661. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js.map +0 -1
  662. package/ts_build/tests/manual/ycmd/test_discover_commands.d.ts +0 -2
  663. package/ts_build/tests/manual/ycmd/test_discover_commands.js +0 -252
  664. package/ts_build/tests/manual/ycmd/test_discover_commands.js.map +0 -1
  665. package/ts_build/tests/manual/ycmd/test_endpoints.d.ts +0 -2
  666. package/ts_build/tests/manual/ycmd/test_endpoints.js +0 -130
  667. package/ts_build/tests/manual/ycmd/test_endpoints.js.map +0 -1
  668. package/ts_build/tests/manual/ycmd/test_final_comprehensive.d.ts +0 -2
  669. package/ts_build/tests/manual/ycmd/test_final_comprehensive.js +0 -231
  670. package/ts_build/tests/manual/ycmd/test_final_comprehensive.js.map +0 -1
  671. package/ts_build/tests/manual/ycmd/test_final_validation.d.ts +0 -2
  672. package/ts_build/tests/manual/ycmd/test_final_validation.js +0 -170
  673. package/ts_build/tests/manual/ycmd/test_final_validation.js.map +0 -1
  674. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.d.ts +0 -2
  675. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js +0 -37
  676. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js.map +0 -1
  677. package/ts_build/tests/manual/ycmd/test_server_manager.d.ts +0 -1
  678. package/ts_build/tests/manual/ycmd/test_server_manager.js +0 -38
  679. package/ts_build/tests/manual/ycmd/test_server_manager.js.map +0 -1
  680. package/ts_build/tests/manual/ycmd/test_simple_debug.d.ts +0 -2
  681. package/ts_build/tests/manual/ycmd/test_simple_debug.js +0 -109
  682. package/ts_build/tests/manual/ycmd/test_simple_debug.js.map +0 -1
  683. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.d.ts +0 -1
  684. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js +0 -138
  685. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js.map +0 -1
  686. package/ts_build/tests/manual/ycmd/test_typescript_simple.d.ts +0 -1
  687. package/ts_build/tests/manual/ycmd/test_typescript_simple.js +0 -76
  688. package/ts_build/tests/manual/ycmd/test_typescript_simple.js.map +0 -1
  689. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.d.ts +0 -1
  690. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js +0 -115
  691. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js.map +0 -1
  692. package/ts_build/tests/manual/ycmd/test_workspace_config.d.ts +0 -1
  693. package/ts_build/tests/manual/ycmd/test_workspace_config.js +0 -99
  694. package/ts_build/tests/manual/ycmd/test_workspace_config.js.map +0 -1
  695. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.d.ts +0 -2
  696. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js +0 -140
  697. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js.map +0 -1
  698. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.d.ts +0 -1
  699. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js +0 -93
  700. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js.map +0 -1
  701. package/ts_build/tests/manual/ycmd/test_ycmd_direct.d.ts +0 -2
  702. package/ts_build/tests/manual/ycmd/test_ycmd_direct.js +0 -159
  703. package/ts_build/tests/manual/ycmd/test_ycmd_direct.js.map +0 -1
  704. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.d.ts +0 -15
  705. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js +0 -68
  706. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js.map +0 -1
  707. package/ts_build/tests/manual/ycmd/test_ycmd_final.d.ts +0 -2
  708. package/ts_build/tests/manual/ycmd/test_ycmd_final.js +0 -205
  709. package/ts_build/tests/manual/ycmd/test_ycmd_final.js.map +0 -1
  710. package/ts_build/tests/manual/ycmd/test_ycmd_integration.d.ts +0 -3
  711. package/ts_build/tests/manual/ycmd/test_ycmd_integration.js +0 -119
  712. package/ts_build/tests/manual/ycmd/test_ycmd_integration.js.map +0 -1
  713. package/ts_build/tests/manual/ycmd/test_ycmd_simple.d.ts +0 -2
  714. package/ts_build/tests/manual/ycmd/test_ycmd_simple.js +0 -36
  715. package/ts_build/tests/manual/ycmd/test_ycmd_simple.js.map +0 -1
  716. package/ts_build/tests/manual/ycmd/working_simple_test.d.ts +0 -2
  717. package/ts_build/tests/manual/ycmd/working_simple_test.js +0 -144
  718. package/ts_build/tests/manual/ycmd/working_simple_test.js.map +0 -1
  719. package/ts_build/tests/patching/corrupted.test.d.ts +0 -1
  720. package/ts_build/tests/patching/corrupted.test.js +0 -53
  721. package/ts_build/tests/patching/corrupted.test.js.map +0 -1
  722. package/ts_build/tests/patching/imports.test.d.ts +0 -1
  723. package/ts_build/tests/patching/imports.test.js +0 -71
  724. package/ts_build/tests/patching/imports.test.js.map +0 -1
  725. package/ts_build/tests/patching/patchFileOutput.test.d.ts +0 -1
  726. package/ts_build/tests/patching/patchFileOutput.test.js +0 -269
  727. package/ts_build/tests/patching/patchFileOutput.test.js.map +0 -1
  728. package/ts_build/tests/patching/regression-2026.test.d.ts +0 -1
  729. package/ts_build/tests/patching/regression-2026.test.js +0 -528
  730. package/ts_build/tests/patching/regression-2026.test.js.map +0 -1
  731. package/ts_build/tests/patching/transcriptMangleRegression.test.d.ts +0 -1
  732. package/ts_build/tests/patching/transcriptMangleRegression.test.js +0 -104
  733. package/ts_build/tests/patching/transcriptMangleRegression.test.js.map +0 -1
  734. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.d.ts +0 -1
  735. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +0 -294
  736. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +0 -1
  737. package/ts_build/tests/plugins/language/languagePlugin-integration.test.d.ts +0 -1
  738. package/ts_build/tests/plugins/language/languagePlugin-integration.test.js +0 -343
  739. package/ts_build/tests/plugins/language/languagePlugin-integration.test.js.map +0 -1
  740. package/ts_build/tests/plugins/language/languagePlugin.test.d.ts +0 -1
  741. package/ts_build/tests/plugins/language/languagePlugin.test.js +0 -315
  742. package/ts_build/tests/plugins/language/languagePlugin.test.js.map +0 -1
  743. package/ts_build/tests/processes/managedProcessShim.test.d.ts +0 -1
  744. package/ts_build/tests/processes/managedProcessShim.test.js +0 -92
  745. package/ts_build/tests/processes/managedProcessShim.test.js.map +0 -1
  746. package/ts_build/tests/processors/Base64ImageDetector.test.d.ts +0 -1
  747. package/ts_build/tests/processors/Base64ImageDetector.test.js +0 -792
  748. package/ts_build/tests/processors/Base64ImageDetector.test.js.map +0 -1
  749. package/ts_build/tests/processors/CustomVariables.test.d.ts +0 -1
  750. package/ts_build/tests/processors/CustomVariables.test.js +0 -764
  751. package/ts_build/tests/processors/CustomVariables.test.js.map +0 -1
  752. package/ts_build/tests/processors/CustomVariablesBenchmark.test.d.ts +0 -1
  753. package/ts_build/tests/processors/CustomVariablesBenchmark.test.js +0 -179
  754. package/ts_build/tests/processors/CustomVariablesBenchmark.test.js.map +0 -1
  755. package/ts_build/tests/processors/HarmonyToolProcessor.test.d.ts +0 -1
  756. package/ts_build/tests/processors/HarmonyToolProcessor.test.js +0 -382
  757. package/ts_build/tests/processors/HarmonyToolProcessor.test.js.map +0 -1
  758. package/ts_build/tests/processors/TokenCompressor.test.d.ts +0 -1
  759. package/ts_build/tests/processors/TokenCompressor.test.js +0 -473
  760. package/ts_build/tests/processors/TokenCompressor.test.js.map +0 -1
  761. package/ts_build/tests/processors/ToolResponseCache.test.d.ts +0 -1
  762. package/ts_build/tests/processors/ToolResponseCache.test.js +0 -657
  763. package/ts_build/tests/processors/ToolResponseCache.test.js.map +0 -1
  764. package/ts_build/tests/processors/tools/boundedRetrievalTools.test.d.ts +0 -1
  765. package/ts_build/tests/processors/tools/boundedRetrievalTools.test.js +0 -57
  766. package/ts_build/tests/processors/tools/boundedRetrievalTools.test.js.map +0 -1
  767. package/ts_build/tests/processors/tools/grepToolResponse.test.d.ts +0 -1
  768. package/ts_build/tests/processors/tools/grepToolResponse.test.js +0 -77
  769. package/ts_build/tests/processors/tools/grepToolResponse.test.js.map +0 -1
  770. package/ts_build/tests/services/ConversionService.test.d.ts +0 -1
  771. package/ts_build/tests/services/ConversionService.test.js +0 -154
  772. package/ts_build/tests/services/ConversionService.test.js.map +0 -1
  773. package/ts_build/tests/services/DockerService.test.d.ts +0 -1
  774. package/ts_build/tests/services/DockerService.test.js +0 -22
  775. package/ts_build/tests/services/DockerService.test.js.map +0 -1
  776. package/ts_build/tests/services/Tools.test.d.ts +0 -1
  777. package/ts_build/tests/services/Tools.test.js +0 -1365
  778. package/ts_build/tests/services/Tools.test.js.map +0 -1
  779. package/ts_build/tests/services/ToolsService.setFunction.test.d.ts +0 -1
  780. package/ts_build/tests/services/ToolsService.setFunction.test.js +0 -51
  781. package/ts_build/tests/services/ToolsService.setFunction.test.js.map +0 -1
  782. package/ts_build/tests/services/WorkerReloadConfig.test.d.ts +0 -1
  783. package/ts_build/tests/services/WorkerReloadConfig.test.js +0 -86
  784. package/ts_build/tests/services/WorkerReloadConfig.test.js.map +0 -1
  785. package/ts_build/tests/test.spec.d.ts +0 -1
  786. package/ts_build/tests/test.spec.js +0 -139
  787. package/ts_build/tests/test.spec.js.map +0 -1
  788. package/ts_build/tests/unit/InputQueueManager.test.d.ts +0 -1
  789. package/ts_build/tests/unit/InputQueueManager.test.js +0 -104
  790. package/ts_build/tests/unit/InputQueueManager.test.js.map +0 -1
  791. package/ts_build/tests/unit/McpWebsocketTransport.test.d.ts +0 -1
  792. package/ts_build/tests/unit/McpWebsocketTransport.test.js +0 -47
  793. package/ts_build/tests/unit/McpWebsocketTransport.test.js.map +0 -1
  794. package/ts_build/tests/unit/agents/historyRollback.test.d.ts +0 -1
  795. package/ts_build/tests/unit/agents/historyRollback.test.js +0 -42
  796. package/ts_build/tests/unit/agents/historyRollback.test.js.map +0 -1
  797. package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.d.ts +0 -1
  798. package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.js +0 -67
  799. package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.js.map +0 -1
  800. package/ts_build/tests/unit/auth/jwtStore.test.d.ts +0 -1
  801. package/ts_build/tests/unit/auth/jwtStore.test.js +0 -46
  802. package/ts_build/tests/unit/auth/jwtStore.test.js.map +0 -1
  803. package/ts_build/tests/unit/auth/keyAuth.test.d.ts +0 -1
  804. package/ts_build/tests/unit/auth/keyAuth.test.js +0 -118
  805. package/ts_build/tests/unit/auth/keyAuth.test.js.map +0 -1
  806. package/ts_build/tests/unit/auth/keyManager.test.d.ts +0 -1
  807. package/ts_build/tests/unit/auth/keyManager.test.js +0 -96
  808. package/ts_build/tests/unit/auth/keyManager.test.js.map +0 -1
  809. package/ts_build/tests/unit/auth/registerIdentity.test.d.ts +0 -1
  810. package/ts_build/tests/unit/auth/registerIdentity.test.js +0 -92
  811. package/ts_build/tests/unit/auth/registerIdentity.test.js.map +0 -1
  812. package/ts_build/tests/unit/chat/ToolCommandModule.test.d.ts +0 -1
  813. package/ts_build/tests/unit/chat/ToolCommandModule.test.js +0 -61
  814. package/ts_build/tests/unit/chat/ToolCommandModule.test.js.map +0 -1
  815. package/ts_build/tests/unit/chat/historyCommandArgs.test.d.ts +0 -1
  816. package/ts_build/tests/unit/chat/historyCommandArgs.test.js +0 -29
  817. package/ts_build/tests/unit/chat/historyCommandArgs.test.js.map +0 -1
  818. package/ts_build/tests/unit/clients/AIClient.test.d.ts +0 -1
  819. package/ts_build/tests/unit/clients/AIClient.test.js +0 -342
  820. package/ts_build/tests/unit/clients/AIClient.test.js.map +0 -1
  821. package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.d.ts +0 -1
  822. package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.js +0 -77
  823. package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.js.map +0 -1
  824. package/ts_build/tests/unit/clients/attribution.test.d.ts +0 -1
  825. package/ts_build/tests/unit/clients/attribution.test.js +0 -153
  826. package/ts_build/tests/unit/clients/attribution.test.js.map +0 -1
  827. package/ts_build/tests/unit/clients/http.responseMetadata.test.d.ts +0 -1
  828. package/ts_build/tests/unit/clients/http.responseMetadata.test.js +0 -77
  829. package/ts_build/tests/unit/clients/http.responseMetadata.test.js.map +0 -1
  830. package/ts_build/tests/unit/clients/openai.responseMetadata.test.d.ts +0 -1
  831. package/ts_build/tests/unit/clients/openai.responseMetadata.test.js +0 -86
  832. package/ts_build/tests/unit/clients/openai.responseMetadata.test.js.map +0 -1
  833. package/ts_build/tests/unit/clients/responseMetadata.test.d.ts +0 -1
  834. package/ts_build/tests/unit/clients/responseMetadata.test.js +0 -96
  835. package/ts_build/tests/unit/clients/responseMetadata.test.js.map +0 -1
  836. package/ts_build/tests/unit/clients/withRetry.test.d.ts +0 -1
  837. package/ts_build/tests/unit/clients/withRetry.test.js +0 -225
  838. package/ts_build/tests/unit/clients/withRetry.test.js.map +0 -1
  839. package/ts_build/tests/unit/commands/agents.test.d.ts +0 -1
  840. package/ts_build/tests/unit/commands/agents.test.js +0 -119
  841. package/ts_build/tests/unit/commands/agents.test.js.map +0 -1
  842. package/ts_build/tests/unit/commands/github-credentials.test.d.ts +0 -1
  843. package/ts_build/tests/unit/commands/github-credentials.test.js +0 -145
  844. package/ts_build/tests/unit/commands/github-credentials.test.js.map +0 -1
  845. package/ts_build/tests/unit/commands/misc.test.d.ts +0 -1
  846. package/ts_build/tests/unit/commands/misc.test.js +0 -70
  847. package/ts_build/tests/unit/commands/misc.test.js.map +0 -1
  848. package/ts_build/tests/unit/commands/remote.test.d.ts +0 -1
  849. package/ts_build/tests/unit/commands/remote.test.js +0 -70
  850. package/ts_build/tests/unit/commands/remote.test.js.map +0 -1
  851. package/ts_build/tests/unit/commands/sandbox.test.d.ts +0 -1
  852. package/ts_build/tests/unit/commands/sandbox.test.js +0 -258
  853. package/ts_build/tests/unit/commands/sandbox.test.js.map +0 -1
  854. package/ts_build/tests/unit/hashes.test.d.ts +0 -1
  855. package/ts_build/tests/unit/hashes.test.js +0 -25
  856. package/ts_build/tests/unit/hashes.test.js.map +0 -1
  857. package/ts_build/tests/unit/input-queue.test.d.ts +0 -1
  858. package/ts_build/tests/unit/input-queue.test.js +0 -32
  859. package/ts_build/tests/unit/input-queue.test.js.map +0 -1
  860. package/ts_build/tests/unit/login.test.d.ts +0 -1
  861. package/ts_build/tests/unit/login.test.js +0 -166
  862. package/ts_build/tests/unit/login.test.js.map +0 -1
  863. package/ts_build/tests/unit/modules/moduleLoading.test.d.ts +0 -1
  864. package/ts_build/tests/unit/modules/moduleLoading.test.js +0 -272
  865. package/ts_build/tests/unit/modules/moduleLoading.test.js.map +0 -1
  866. package/ts_build/tests/unit/plugins/pluginLoading.test.d.ts +0 -1
  867. package/ts_build/tests/unit/plugins/pluginLoading.test.js +0 -117
  868. package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +0 -1
  869. package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.d.ts +0 -1
  870. package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js +0 -32
  871. package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js.map +0 -1
  872. package/ts_build/tests/unit/services/KnowhowClient.test.d.ts +0 -1
  873. package/ts_build/tests/unit/services/KnowhowClient.test.js +0 -69
  874. package/ts_build/tests/unit/services/KnowhowClient.test.js.map +0 -1
  875. package/ts_build/tests/unit/services/LazyToolsService.test.d.ts +0 -1
  876. package/ts_build/tests/unit/services/LazyToolsService.test.js +0 -47
  877. package/ts_build/tests/unit/services/LazyToolsService.test.js.map +0 -1
  878. package/ts_build/tests/unit/services/Mcp.test.d.ts +0 -1
  879. package/ts_build/tests/unit/services/Mcp.test.js +0 -45
  880. package/ts_build/tests/unit/services/Mcp.test.js.map +0 -1
  881. package/ts_build/tests/unit/services/MinimalToolsService.test.d.ts +0 -1
  882. package/ts_build/tests/unit/services/MinimalToolsService.test.js +0 -320
  883. package/ts_build/tests/unit/services/MinimalToolsService.test.js.map +0 -1
  884. package/ts_build/tests/unit/services/RuntimeReloadService.test.d.ts +0 -1
  885. package/ts_build/tests/unit/services/RuntimeReloadService.test.js +0 -26
  886. package/ts_build/tests/unit/services/RuntimeReloadService.test.js.map +0 -1
  887. package/ts_build/tests/unit/services/SessionManager.test.d.ts +0 -1
  888. package/ts_build/tests/unit/services/SessionManager.test.js +0 -72
  889. package/ts_build/tests/unit/services/SessionManager.test.js.map +0 -1
  890. package/ts_build/tests/unit/services/SyncedAgentWatcher.test.d.ts +0 -1
  891. package/ts_build/tests/unit/services/SyncedAgentWatcher.test.js +0 -78
  892. package/ts_build/tests/unit/services/SyncedAgentWatcher.test.js.map +0 -1
  893. package/ts_build/tests/unit/services/SyncerService.test.d.ts +0 -1
  894. package/ts_build/tests/unit/services/SyncerService.test.js +0 -40
  895. package/ts_build/tests/unit/services/SyncerService.test.js.map +0 -1
  896. package/ts_build/tests/unit/tunnel.test.d.ts +0 -1
  897. package/ts_build/tests/unit/tunnel.test.js +0 -47
  898. package/ts_build/tests/unit/tunnel.test.js.map +0 -1
  899. package/ts_build/tests/unit/util/Trace.test.d.ts +0 -1
  900. package/ts_build/tests/unit/util/Trace.test.js +0 -107
  901. package/ts_build/tests/unit/util/Trace.test.js.map +0 -1
  902. package/ts_build/tests/unit/utils/http.test.d.ts +0 -1
  903. package/ts_build/tests/unit/utils/http.test.js +0 -69
  904. package/ts_build/tests/unit/utils/http.test.js.map +0 -1
  905. package/tsconfig.json +0 -34
  906. package/tslint.json +0 -11
@@ -1,1664 +0,0 @@
1
- /**
2
- * Agent Chat Module - Handles agent interactions
3
- */
4
- import { EventService } from "../../services/EventService";
5
- import { ConsoleRenderer, AgentRenderer } from "../renderer";
6
- import {
7
- SessionManager,
8
- TaskRegistry,
9
- SyncedAgentWatcher,
10
- SyncerService,
11
- AgentService,
12
- } from "../../services/index";
13
- import { AttachableAgent } from "../../services/SyncedAgentWatcher";
14
- import * as fs from "fs";
15
- import * as fsPromises from "fs/promises";
16
- import * as path from "path";
17
-
18
- import { BaseChatModule } from "./BaseChatModule";
19
- import { services } from "../../services/index";
20
- import { BaseAgent } from "../../agents/index";
21
- import { ChatCommand, ChatMode, ChatContext, ChatService } from "../types";
22
- import {
23
- Message,
24
- CompletionOptions,
25
- REASONING_EFFORTS,
26
- isReasoningEffort,
27
- } from "../../clients/types";
28
- import { ChatInteraction } from "../../types";
29
- import { Marked } from "../../utils/index";
30
- import { TokenCompressor } from "../../processors/TokenCompressor";
31
- import { ToolResponseCache } from "../../processors/ToolResponseCache";
32
- import {
33
- CustomVariables,
34
- XmlToolCallProcessor,
35
- HarmonyToolProcessor,
36
- GemmaToolProcessor,
37
- Base64ImageProcessor,
38
- MinimalToolsMessageProcessor,
39
- } from "../../processors/index";
40
- import { TaskInfo } from "../types";
41
- import { createAgent, agentConstructors, AgentName } from "../../agents";
42
- import { ToolCallEvent } from "../../agents/base/base";
43
- import { rollbackAgentInteractions } from "../../agents/historyRollback";
44
- import { KnowhowSimpleClient } from "../../services/KnowhowClient";
45
- import { TraceAll } from "../../util/Trace";
46
-
47
- @TraceAll()
48
- export class AgentModule extends BaseChatModule {
49
- name = "agent";
50
- description = "Agent interaction functionality";
51
-
52
- /** Currently attached agent (for agent:attached mode commands) */
53
- private attachedAgent: AttachableAgent | undefined;
54
-
55
- // Service instances for task management, session management, and synchronization
56
- private taskRegistry: TaskRegistry;
57
- private sessionManager: SessionManager;
58
- /** Timestamp when this process started - used to filter sessions */
59
- private processStartTime: number = Date.now();
60
- /** Currently attached agent task ID */
61
- private activeAgentTaskId: string | undefined;
62
- /** Currently active synced agent watcher (for FS or Web agents) */
63
- private activeSyncedWatcher: SyncedAgentWatcher | undefined;
64
-
65
- /** Reasoning effort to apply to agents started from this module */
66
- private reasoningEffort: CompletionOptions["reasoning_effort"] | undefined = undefined;
67
- /** Whether to request a reasoning summary from supporting models */
68
- private summarizeReasoning: boolean = true;
69
-
70
- /** Delayed finalAnswer output, cancelled when the task's done event arrives. */
71
- private pendingFinalAnswers = new Map<string, ReturnType<typeof setTimeout>>();
72
-
73
- /** Stored wire params for rewireAgentRendering */
74
- private _wireAgentEvents: EventService | undefined;
75
- private _wireTaskId: string | undefined;
76
- private _wireAgentName: string | undefined;
77
- /** Optional reference to RemoteSyncModule for auto-sync on new tasks */
78
- private remoteSyncModule: any | undefined;
79
-
80
- private _wireEventTypes:
81
- | { toolCall?: string; toolUsed?: string; agentSay?: string; done: string }
82
- | undefined;
83
-
84
- private agentService: AgentService;
85
- private eventService: EventService;
86
-
87
- constructor() {
88
- super();
89
- this.taskRegistry = new TaskRegistry();
90
- this.sessionManager = new SessionManager();
91
- this.agentService = services().Agents;
92
- this.eventService = services().Events;
93
- }
94
-
95
- /**
96
- * Set the RemoteSyncModule reference for auto-sync support.
97
- * Called from InternalChatModule after both modules are created.
98
- */
99
- public setRemoteSyncModule(module: any): void {
100
- this.remoteSyncModule = module;
101
- }
102
-
103
- getCommands(): ChatCommand[] {
104
- return [
105
- {
106
- name: "agent",
107
- description: "Start an agent by name",
108
- handler: this.handleAgentCommand.bind(this),
109
- },
110
- {
111
- name: "agents",
112
- description: "List available agents",
113
- handler: this.handleAgentsCommand.bind(this),
114
- },
115
- {
116
- name: "pause",
117
- description: "Pause the currently attached agent",
118
- modes: ["agent:attached"],
119
- handler: async (_args: string[]): Promise<void> => {
120
- if (this.attachedAgent) {
121
- await this.attachedAgent.pause();
122
- console.log("Agent paused.");
123
- }
124
- },
125
- },
126
- {
127
- name: "unpause",
128
- description: "Unpause the currently attached agent",
129
- modes: ["agent:attached"],
130
- handler: async (_args: string[]): Promise<void> => {
131
- if (this.attachedAgent) {
132
- await this.attachedAgent.unpause();
133
- console.log("Agent unpaused.");
134
- }
135
- },
136
- },
137
- {
138
- name: "kill",
139
- description: "Kill the currently attached agent",
140
- modes: ["agent:attached"],
141
- handler: async (_args: string[]): Promise<void> => {
142
- if (this.attachedAgent) {
143
- await this.attachedAgent.kill();
144
- console.log("Agent terminated.");
145
- this.detachFromAgent();
146
- }
147
- },
148
- },
149
- {
150
- name: "poke",
151
- description:
152
- "Interrupt the agent's current tool call or AI completion, so it can continue with the next step",
153
- modes: ["agent:attached"],
154
- handler: async (args: string[]): Promise<void> => {
155
- if (this.attachedAgent) {
156
- const message = args.length > 0 ? args.join(" ") : undefined;
157
- this.attachedAgent.interrupt(message);
158
- console.log(
159
- "Agent interrupted — it will continue with the next step."
160
- );
161
- }
162
- },
163
- },
164
- {
165
- name: "compact",
166
- description:
167
- "Force the attached agent to compact (summarize) its conversation now, dropping back to a much cheaper context size",
168
- modes: ["agent:attached"],
169
- handler: async (_args: string[]): Promise<void> => {
170
- if (!this.attachedAgent) {
171
- console.log("No attached agent to compact.");
172
- return;
173
- }
174
- if (typeof this.attachedAgent.requestCompact !== "function") {
175
- console.log(
176
- "This agent does not support manual compaction (remote/watcher-backed agents compact automatically)."
177
- );
178
- return;
179
- }
180
- this.attachedAgent.requestCompact();
181
- // Do NOT interrupt — compaction should not cancel the in-progress
182
- // tool call / AI completion. The _forceCompact flag is picked up at
183
- // the compression check on the next loop iteration, once the current
184
- // step finishes naturally.
185
- console.log(
186
- "🗜 Compaction requested — the agent will summarize and shrink its context on the next step."
187
- );
188
- },
189
- },
190
- {
191
- name: "reasoning_effort",
192
- description:
193
- `Set the reasoning effort for the agent (${REASONING_EFFORTS.join(", ")}). Individual models support different subsets.`,
194
- handler: async (args: string[]): Promise<void> => {
195
- const effort = args[0];
196
- if (!isReasoningEffort(effort)) {
197
- console.log(
198
- `Current reasoning effort: ${this.reasoningEffort ?? "(not set — model default)"}`
199
- );
200
- console.log(
201
- `Usage: /reasoning_effort <${REASONING_EFFORTS.join("|")}>`
202
- );
203
- return;
204
- }
205
- this.reasoningEffort = effort;
206
- const agent = (this.chatService?.getContext()?.selectedAgent as BaseAgent);
207
- if (agent) agent.setReasoningEffort(effort);
208
- console.log(`Reasoning effort set to: ${effort}`);
209
- },
210
- },
211
- {
212
- name: "effort",
213
- description: "Alias for /reasoning_effort",
214
- handler: async (args: string[]): Promise<void> => {
215
- const effort = args[0];
216
- if (!isReasoningEffort(effort)) {
217
- console.log(
218
- `Current reasoning effort: ${this.reasoningEffort ?? "(not set — model default)"}`
219
- );
220
- console.log(
221
- `Usage: /effort <${REASONING_EFFORTS.join("|")}>`
222
- );
223
- return;
224
- }
225
- this.reasoningEffort = effort;
226
- const agent = (this.chatService?.getContext()?.selectedAgent as BaseAgent);
227
- if (agent) agent.setReasoningEffort(effort);
228
- console.log(`Reasoning effort set to: ${effort}`);
229
- },
230
- },
231
- {
232
- name: "reasoning_summary",
233
- description:
234
- "Toggle whether the agent displays a reasoning summary (true/false). Supported by reasoning models only.",
235
- handler: async (args: string[]): Promise<void> => {
236
- const val = args[0];
237
- if (val !== "true" && val !== "false") {
238
- console.log(
239
- `Current reasoning summary: ${this.summarizeReasoning}`
240
- );
241
- console.log(`Usage: /reasoning_summary <true|false>`);
242
- return;
243
- }
244
- this.summarizeReasoning = val === "true";
245
- const agent = (this.chatService?.getContext()?.selectedAgent as BaseAgent);
246
- if (agent) agent.setSummarizeReasoning(this.summarizeReasoning);
247
- console.log(`Reasoning summary set to: ${this.summarizeReasoning}`);
248
- },
249
- },
250
- {
251
- name: "detach",
252
- description: "Detach from the currently attached agent",
253
- modes: ["agent:attached"],
254
- handler: async (_args: string[]): Promise<void> => {
255
- const agent = this.attachedAgent;
256
- console.log("Detached from agent");
257
- // Only detach if we are still attached to THIS agent. If the user
258
- // killed this agent and started a new one while this agent was
259
- // finishing a long tool call, detachFromAgent() would rip out the
260
- // new agent's rendering and reset the mode.
261
- if (agent && this.attachedAgent === agent) {
262
- this.detachFromAgent();
263
- }
264
- },
265
- },
266
- {
267
- name: "done",
268
- description: "Exit the current agent interaction",
269
- modes: ["agent:attached"],
270
- handler: async (_args: string[]): Promise<void> => {
271
- this.detachFromAgent();
272
- },
273
- },
274
- ];
275
- }
276
-
277
- /**
278
- * Clean up attached agent state and restore default mode/prompt.
279
- */
280
- private detachFromAgent(): void {
281
- this.attachedAgent = undefined;
282
-
283
- // Unregister rendering event listeners
284
- this.unwireAgentRendering();
285
-
286
- if (this.chatService) {
287
- this.chatService.setMode("default");
288
- }
289
-
290
- // Stop any active synced watcher
291
- if (this.activeSyncedWatcher) {
292
- this.activeSyncedWatcher.stopWatching();
293
- this.activeSyncedWatcher = undefined;
294
- }
295
-
296
- const context = this.chatService?.getContext();
297
- if (context) context.activeAgentTaskId = undefined;
298
- }
299
-
300
- getModes(): ChatMode[] {
301
- return [
302
- {
303
- name: "agent",
304
- description: "Agent interaction mode",
305
- active: true,
306
- promptText: () => {
307
- const ctx = this.chatService?.getContext();
308
- return ctx?.currentAgent
309
- ? `\nAsk knowhow ${ctx.currentAgent}: `
310
- : `\nAsk knowhow: `;
311
- },
312
- },
313
- {
314
- name: "agent:attached",
315
- description: "Attached to a running agent",
316
- active: false,
317
- promptText: () =>
318
- this.attachedAgent
319
- ? `Enter command or message for ${this.attachedAgent.name}: `
320
- : `Enter command or message for agent: `,
321
- },
322
- ];
323
- }
324
-
325
- /**
326
- * Get the current renderer from the chat context, falling back to a ConsoleRenderer.
327
- */
328
- private get renderer(): AgentRenderer {
329
- return (
330
- (this.chatService?.getContext()?.renderer as AgentRenderer) ??
331
- new ConsoleRenderer()
332
- );
333
- }
334
-
335
- async initialize(service: ChatService): Promise<void> {
336
- await super.initialize(service);
337
-
338
- // Set up plugin log event handler - use setListener so re-init doesn't double-subscribe
339
- const Events = this.eventService;
340
- Events.setListener(
341
- { key: "agentModule:pluginLog", event: Events.eventTypes.pluginLog },
342
- (logEvent: any) => {
343
- const activeTasks = this.taskRegistry.getAll();
344
- this.renderer.render({
345
- type: "log",
346
- taskId: this.activeAgentTaskId,
347
- agentName: logEvent.source,
348
- message: logEvent.message,
349
- level: logEvent.level || "info",
350
- timestamp: logEvent.timestamp || new Date().toISOString(),
351
- });
352
- }
353
- );
354
-
355
- // Determine the default agent from context (set by chat.ts from config.chat.defaultAgent)
356
- // falling back to "Patcher" if not configured.
357
- const context = this.chatService?.getContext();
358
- const defaultAgentName = context?.defaultAgent ?? "Patcher";
359
- await this.handleAgentCommand([defaultAgentName]);
360
-
361
- // Apply defaultModel and defaultProvider if configured
362
- const defaultModel = context?.defaultModel;
363
- const defaultProvider = context?.defaultProvider;
364
- if (defaultModel || defaultProvider) {
365
- const selectedAgent = context?.selectedAgent;
366
- if (selectedAgent) {
367
- if (defaultModel) {
368
- selectedAgent.setModel(defaultModel);
369
- selectedAgent.setModelPreferences([
370
- { model: defaultModel, provider: defaultProvider as any },
371
- ]);
372
- }
373
- if (defaultProvider) {
374
- selectedAgent.setProvider(defaultProvider as any);
375
- }
376
- // Refresh context model/provider display
377
- if (context) {
378
- if (defaultModel) context.currentModel = defaultModel;
379
- if (defaultProvider) context.currentProvider = defaultProvider;
380
- }
381
- }
382
- }
383
- }
384
-
385
-
386
- async handleAgentCommand(args: string[]): Promise<void> {
387
- const context = this.chatService?.getContext();
388
-
389
- // If no args provided, toggle agent mode
390
- if (args.length === 0) {
391
- if (context?.agentMode) {
392
- // Disable agent mode
393
- if (context) {
394
- context.agentMode = false;
395
- context.selectedAgent = undefined;
396
- context.currentAgent = undefined;
397
- this.chatService.disableMode("agent");
398
- }
399
- console.log("Agent mode disabled. Switched to chat mode.");
400
- return;
401
- } else {
402
- // Show usage when not in agent mode and no args
403
- console.log(
404
- "Agent mode is currently disabled. Use /agent <agent_name> to enable it, or /agents to list available agents."
405
- );
406
- return;
407
- }
408
- }
409
-
410
- const agentName = args[0];
411
-
412
- try {
413
- if (agentConstructors[agentName as AgentName]) {
414
- // Set selected agent in context and enable agent mode
415
- if (context) {
416
- // Create a temporary agent instance to read its default model/provider
417
- const agentContext = this.agentService.getAgentContext();
418
- const tempAgent = createAgent(
419
- agentName as AgentName,
420
- agentContext
421
- ) as BaseAgent;
422
- context.selectedAgent = tempAgent;
423
- context.agentMode = true;
424
- context.currentAgent = agentName;
425
- // Update context's model/provider to reflect the agent's settings
426
- // so /model and /provider commands show accurate information
427
-
428
- const clientInfo = await tempAgent.clientService.getClient(
429
- undefined,
430
- tempAgent.getModel()
431
- );
432
-
433
- context.currentModel = clientInfo.model;
434
- context.currentProvider = clientInfo.provider;
435
-
436
- this.chatService.setMode("agent");
437
- }
438
-
439
- console.log(
440
- `Agent mode enabled. Selected agent: ${agentName}. Type your task to get started.`
441
- );
442
- } else if (this.agentService.listAgents().includes(agentName)) {
443
- // Config agent from knowhow.json
444
- if (context) {
445
- const configAgent = this.agentService.getAgent<BaseAgent>(agentName);
446
- context.selectedAgent = configAgent;
447
- context.agentMode = true;
448
- context.currentAgent = agentName;
449
- const clientInfo = await configAgent.clientService.getClient(
450
- undefined,
451
- configAgent.getModel()
452
- );
453
- context.currentModel = clientInfo.model;
454
- context.currentProvider = clientInfo.provider;
455
-
456
- this.chatService.setMode("agent");
457
- }
458
- console.log(
459
- `Agent mode enabled. Selected agent: ${agentName}. Type your task to get started.`
460
- );
461
- } else {
462
- console.log(
463
- `Agent "${agentName}" not found. Use /agents to list available agents.`
464
- );
465
- }
466
- } catch (error) {
467
- console.error(`Error selecting agent ${agentName}:`, error);
468
- }
469
- }
470
-
471
- /**
472
- * Get the task registry for CLI access
473
- */
474
- public getTaskRegistry(): TaskRegistry {
475
- return this.taskRegistry;
476
- }
477
-
478
- /**
479
- * Get the session manager
480
- */
481
- public getSessionManager(): SessionManager {
482
- return this.sessionManager;
483
- }
484
-
485
- /**
486
- * Get the current renderer from the chat context, falling back to a ConsoleRenderer.
487
- */
488
- public getRenderer(): AgentRenderer {
489
- return this.renderer;
490
- }
491
-
492
- /**
493
- * Get the currently active synced watcher
494
- */
495
- public getActiveSyncedWatcher(): SyncedAgentWatcher | undefined {
496
- return this.activeSyncedWatcher;
497
- }
498
-
499
- /**
500
- * Set the currently active synced watcher
501
- */
502
- public setActiveSyncedWatcher(w: SyncedAgentWatcher | undefined): void {
503
- this.activeSyncedWatcher = w;
504
- }
505
-
506
- /**
507
- * Get the currently active agent task ID
508
- */
509
- public getActiveAgentTaskId(): string | undefined {
510
- return this.activeAgentTaskId;
511
- }
512
-
513
- /**
514
- * Set the currently active agent task ID
515
- */
516
- public setActiveAgentTaskId(id: string | undefined): void {
517
- this.activeAgentTaskId = id;
518
- }
519
-
520
- private scheduleFinalAnswer(taskId: string, answer: unknown): void {
521
- this.cancelFinalAnswer(taskId);
522
- const renderedAnswer = typeof answer === "string"
523
- ? answer
524
- : JSON.stringify(answer) ?? String(answer);
525
- const timeout = setTimeout(() => {
526
- this.pendingFinalAnswers.delete(taskId);
527
- console.log(Marked.parse(renderedAnswer));
528
- }, 50);
529
- this.pendingFinalAnswers.set(taskId, timeout);
530
- }
531
-
532
- private cancelFinalAnswer(taskId: string): void {
533
- const timeout = this.pendingFinalAnswers.get(taskId);
534
- if (!timeout) {
535
- return;
536
- }
537
-
538
- clearTimeout(timeout);
539
- this.pendingFinalAnswers.delete(taskId);
540
- }
541
-
542
- /**
543
- * Wire up agentEvents to the renderer for a given task.
544
- * Uses setListener with stable keys so re-calling automatically replaces old listeners.
545
- *
546
- * @param taskId The task ID to pass through to render events
547
- * @param agentEvents An EventEmitter that emits toolCall / toolUsed / agentSay events
548
- * @param eventTypes Object with event name constants (toolCall, toolUsed, agentSay, done)
549
- * @param agentName Display name for the agent
550
- */
551
- public wireAgentRendering(
552
- taskId: string,
553
- agentEvents: EventService,
554
- eventTypes: {
555
- toolCall?: string;
556
- toolUsed?: string;
557
- agentSay?: string;
558
- done: string;
559
- },
560
- agentName: string
561
- ): void {
562
- if (eventTypes.toolCall) {
563
- agentEvents.setListener(
564
- { key: "agentModule:render:toolCall", event: eventTypes.toolCall },
565
- (data: any) =>
566
- this.renderer.render({
567
- type: "toolCall",
568
- taskId,
569
- agentName,
570
- toolCall: data.toolCall,
571
- })
572
- );
573
- }
574
- if (eventTypes.toolUsed) {
575
- agentEvents.setListener(
576
- { key: "agentModule:render:toolUsed", event: eventTypes.toolUsed },
577
- (data: any) => {
578
- this.renderer.render({
579
- type: "toolResult",
580
- taskId,
581
- agentName,
582
- toolCall: data.toolCall,
583
- result: data.functionResp,
584
- });
585
- // Give the done event a chance to render the same answer first. If the
586
- // agent continues, the tool result becomes the fallback output.
587
- const toolName: string = data.toolCall?.function?.name ?? "";
588
- if (toolName === "finalAnswer" || toolName.endsWith("finalAnswer")) {
589
- this.scheduleFinalAnswer(taskId, data.functionResp);
590
- }
591
- }
592
- );
593
- }
594
- agentEvents.setListener(
595
- { key: "agentModule:render:done", event: eventTypes.done },
596
- () => this.cancelFinalAnswer(taskId)
597
- );
598
- if (eventTypes.agentSay) {
599
- agentEvents.setListener(
600
- { key: "agentModule:render:agentSay", event: eventTypes.agentSay },
601
- (data: any) =>
602
- this.renderer.render({
603
- type: "agentMessage",
604
- taskId,
605
- agentName,
606
- message: data.message,
607
- role: "assistant",
608
- })
609
- );
610
- }
611
-
612
- // Set active task on the renderer
613
- this.activeAgentTaskId = taskId;
614
- this.renderer.setActiveTaskId(taskId);
615
-
616
- // Store agentEvents reference for unwire/rewire
617
- this._wireAgentEvents = agentEvents;
618
- this._wireAgentName = agentName;
619
- this._wireEventTypes = eventTypes;
620
- this._wireTaskId = taskId;
621
- }
622
-
623
- /**
624
- * Unwire rendering event listeners that were set up by wireAgentRendering().
625
- * Clears the active task on the renderer.
626
- */
627
- public unwireAgentRendering(): void {
628
- if (this._wireTaskId) {
629
- this.cancelFinalAnswer(this._wireTaskId);
630
- }
631
- if (this._wireAgentEvents) {
632
- this._wireAgentEvents.removeManagedListenersByPrefix(
633
- "agentModule:render:"
634
- );
635
- this._wireAgentEvents = undefined;
636
- }
637
- this.activeAgentTaskId = undefined;
638
- this.renderer.setActiveTaskId(undefined);
639
- }
640
-
641
- /**
642
- * Rewire rendering event listeners to the current renderer.
643
- * Call this after switching the active renderer (e.g. via /render) so that
644
- * in-progress agents forward events to the new renderer.
645
- * Since setListener auto-replaces, just re-call wireAgentRendering with stored params.
646
- */
647
- public rewireAgentRendering(): void {
648
- if (
649
- !this._wireAgentEvents ||
650
- !this._wireTaskId ||
651
- !this._wireEventTypes ||
652
- !this._wireAgentName
653
- )
654
- return;
655
- this.wireAgentRendering(
656
- this._wireTaskId,
657
- this._wireAgentEvents,
658
- this._wireEventTypes,
659
- this._wireAgentName
660
- );
661
- }
662
-
663
- /**
664
- * List available agents and optionally select one interactively
665
- */
666
- async handleAgentsCommand(args: string[]): Promise<void> {
667
- try {
668
- const builtinNames = Object.keys(agentConstructors);
669
- const configAgentNames = this.agentService.listAgents();
670
- // Merge, deduplicate, preserving built-ins first
671
- const agentNames = [...new Set([...builtinNames, ...configAgentNames])];
672
-
673
- if (agentNames.length > 0) {
674
- console.log("\nAvailable agents:");
675
- agentNames.forEach((name) => {
676
- const isConfig = !builtinNames.includes(name);
677
- console.log(` - ${name}${isConfig ? " (config)" : ""}`);
678
- });
679
- console.log("─".repeat(80), "\n");
680
-
681
- const selectedAgent = await this.chatService?.getInput(
682
- "Select an agent to start: ",
683
- agentNames
684
- );
685
-
686
- if (
687
- selectedAgent &&
688
- selectedAgent.trim() &&
689
- agentNames.includes(selectedAgent.trim())
690
- ) {
691
- await this.handleAgentCommand([selectedAgent.trim()]);
692
- } else if (selectedAgent && selectedAgent.trim()) {
693
- console.log(`Agent "${selectedAgent.trim()}" not found.`);
694
- }
695
- }
696
- } catch (error) {
697
- console.error("Error listing agents:", error);
698
- console.log("Could not load agents list.");
699
- }
700
- }
701
-
702
- /**
703
- * Get the process start time
704
- */
705
- public getProcessStartTime(): number {
706
- return this.processStartTime;
707
- }
708
-
709
- /**
710
- * Resume a session from saved state
711
- */
712
- public async resumeSession(
713
- sessionId: string,
714
- resumeReason?: string,
715
- rollback: number = 0
716
- ): Promise<void> {
717
- try {
718
- const session = this.sessionManager.loadSession(sessionId);
719
- if (!session) {
720
- console.error(`Session ${sessionId} not found.`);
721
- return;
722
- }
723
- // Session files from older runs may not contain model/provider settings.
724
- // Prefer task metadata, which is updated from the live agent on every
725
- // thread update and is therefore the authoritative resume configuration.
726
- const savedSettings = await this.loadTaskSettings(
727
- session.taskId || sessionId
728
- );
729
- console.log(`\n🔄 Resuming session: ${sessionId}`);
730
- console.log(`Agent: ${savedSettings.agentName || session.agentName}`);
731
- console.log(`Original task: ${session.initialInput}`);
732
- console.log(`Status: ${session.status}`);
733
-
734
- // Build resume prompt (same pattern as resumeFromMessages)
735
- const resumePrompt = [
736
- "You are resuming a previously started task.",
737
- session.initialInput ? `ORIGINAL REQUEST: ${session.initialInput}` : "",
738
- "Please continue from where you left off and complete the original request.",
739
- resumeReason ? `Reason for resuming: ${resumeReason}` : "",
740
- ]
741
- .filter(Boolean)
742
- .join("\n");
743
-
744
- // Restore the full message history from the last thread
745
- const threads = session.threads || [];
746
- // Guard against sessions saved with a flat Message[] instead of Message[][]
747
- // (a bug where threadUpdate emitted a single thread instead of all threads)
748
- const normalizedThreads: Message[][] =
749
- threads.length > 0 && !Array.isArray(threads[0])
750
- ? [threads as unknown as Message[]]
751
- : (threads as Message[][]);
752
- const rolledBackThreads = rollbackAgentInteractions(normalizedThreads, rollback);
753
- const resumeMessages = rolledBackThreads[rolledBackThreads.length - 1] || [];
754
-
755
- // Append the resume prompt to the last user message (or add a new one)
756
- const reversedIndex = [...resumeMessages]
757
- .reverse()
758
- .findIndex((e) => e.role === "user" && typeof e.content === "string");
759
-
760
- if (reversedIndex === -1) {
761
- resumeMessages.push({ role: "user", content: resumePrompt });
762
- } else {
763
- const actualIndex = resumeMessages.length - 1 - reversedIndex;
764
- resumeMessages[actualIndex] = {
765
- ...resumeMessages[actualIndex],
766
- content:
767
- resumeMessages[actualIndex].content +
768
- `\n\n<Workflow>[RESUME CONTEXT]: ${resumePrompt}</Workflow>`,
769
- };
770
- }
771
-
772
- console.log("🚀 Session resuming...");
773
- const context = this.chatService?.getContext();
774
- const agentName =
775
- savedSettings.agentName || session.agentName || context.currentAgent;
776
- const previousAgentMode = context?.agentMode;
777
-
778
- if (!agentName) {
779
- console.error(`Agent ${agentName} not found.`);
780
- return;
781
- }
782
-
783
- // setupAgent resolves both built-in agents and custom ConfigAgents. Do
784
- // not reject config-defined agents here before it gets that opportunity.
785
-
786
- // Start agent with Knowhow task context and restored message history
787
- const remoteTaskId = asRemoteTaskId(
788
- savedSettings.remoteTaskId || session.knowhowTaskId
789
- );
790
- const { agent, taskId } = await this.setupAgent({
791
- agentName,
792
- input: resumePrompt,
793
- // Resume attaches to the persisted remote task; it must not create a
794
- // new task from the original message placeholder.
795
- remoteTaskId,
796
- remoteMessageId: session.knowhowMessageId,
797
- chatSessionId: session.chatSessionId,
798
- syncRemote: !!remoteTaskId,
799
- taskId: session.taskId || sessionId,
800
- chatHistory: [],
801
- run: false, // Don't run yet, we need to set up event listeners first
802
- // Prefer authoritative task metadata over potentially incomplete sessions.
803
- model: savedSettings.model || session.model,
804
- provider: savedSettings.provider || session.provider,
805
- reasoningEffort: savedSettings.reasoningEffort ?? session.reasoningEffort,
806
- summarizeReasoning: savedSettings.summarizeReasoning ?? session.summarizeReasoning,
807
- enabledTools: savedSettings.enabledTools || session.enabledTools,
808
- });
809
-
810
- // Match new interactive threads: local-only sessions get a fresh remote
811
- // task when auto-sync is enabled.
812
- if (!remoteTaskId && this.remoteSyncModule?.isAutoSyncEnabled()) {
813
- this.remoteSyncModule.syncTaskInBackground(taskId);
814
- }
815
-
816
- // After resume finishes, revert to normal chat (non-agent mode) so the
817
- // user can start a fresh conversation instead of staying locked in agent mode.
818
- agent.agentEvents.once(agent.eventTypes.done, () => {
819
- const ctx = this.chatService?.getContext();
820
- if (ctx && !previousAgentMode) {
821
- ctx.agentMode = false;
822
- ctx.selectedAgent = undefined;
823
- ctx.currentAgent = undefined;
824
- this.chatService?.disableMode("agent");
825
- }
826
- });
827
-
828
- await this.attachedAgentChatLoop(
829
- taskId,
830
- agent,
831
- resumePrompt,
832
- resumeMessages
833
- );
834
- } catch (error) {
835
- console.error(
836
- `Failed to resume session ${sessionId}:`,
837
- (error as Error).message
838
- );
839
- }
840
- }
841
-
842
- async handleInput(input: string, context: ChatContext): Promise<boolean> {
843
- // If in agent mode, start agent with the input as initial task (like original chat.ts)
844
- if (context.agentMode && context.selectedAgent) {
845
- // If we're attached to a running agent, forward input to it
846
- if (this.attachedAgent) {
847
- this.attachedAgent.addPendingUserMessage({
848
- role: "user",
849
- content: input,
850
- });
851
- return true;
852
- }
853
-
854
- context.chatHistory = context.chatHistory || [];
855
-
856
- const { taskId } = await this.startAgent(
857
- context.selectedAgent,
858
- input,
859
- context.chatHistory
860
- );
861
-
862
- context.chatHistory.push({
863
- input,
864
- output: "", // Output will be filled in when the agent responds and the session is updated
865
- taskId,
866
- });
867
-
868
- return true;
869
- }
870
- return false;
871
- }
872
-
873
- /**
874
- * Setup and run an agent directly with CLI options (for CLI usage)
875
- */
876
- public async setupAgent(options: {
877
- agentName: string;
878
- input: string;
879
- remoteTaskId?: string;
880
- remoteMessageId?: string;
881
- chatSessionId?: string;
882
- messageId?: string;
883
- syncFs?: boolean;
884
- syncRemote?: boolean;
885
- provider?: string;
886
- model?: string;
887
- maxTimeLimit?: number; // in minutes
888
- maxSpendLimit?: number; // in dollars
889
- chatHistory?: ChatInteraction[];
890
- run?: boolean; // whether to run immediately
891
- taskId?: string; // optional pre-generated taskId
892
- parentTaskId?: string; // taskId of the parent agent that spawned this task
893
- // Reasoning settings to restore (e.g. on resume). When provided these take
894
- // precedence over the module-level CLI defaults.
895
- reasoningEffort?: CompletionOptions["reasoning_effort"];
896
- summarizeReasoning?: boolean;
897
- enabledTools?: string[];
898
- }) {
899
- const { input, chatHistory = [], agentName } = options;
900
- const agentContext = this.agentService.getAgentContext();
901
-
902
- // Resolve agent: built-in agents first, then fall back to ConfigAgents from knowhow.json
903
- let agent: BaseAgent;
904
- if (agentConstructors[options.agentName as AgentName]) {
905
- agent = createAgent(options.agentName as AgentName, agentContext) as BaseAgent;
906
- } else {
907
- // Try to find a ConfigAgent registered via loadAgentsFromConfig (from knowhow.json agents[])
908
- try {
909
- const configAgent = this.agentService.getAgent(options.agentName);
910
- agent = configAgent as unknown as BaseAgent;
911
- } catch {
912
- throw new Error(
913
- `Agent "${options.agentName}" not found. Available agents: ${Object.keys(agentConstructors).join(", ")} (plus any agents defined in knowhow.json)`
914
- );
915
- }
916
- }
917
-
918
- if (options.enabledTools) {
919
- agent.restoreEnabledTools(options.enabledTools);
920
- }
921
-
922
- // Restore persisted configuration before registering or saving this task.
923
- // Otherwise the newly constructed agent's defaults can overwrite the
924
- // original run settings during resume setup.
925
- if (options.model) {
926
- console.log("Setting model:", options.model);
927
- agent.setModel(options.model);
928
- agent.setModelPreferences([
929
- { model: options.model, provider: options.provider as any },
930
- ]);
931
- }
932
-
933
- if (options.provider) {
934
- agent.setProvider(options.provider as any);
935
- }
936
-
937
- const effectiveReasoningEffort =
938
- options.reasoningEffort !== undefined
939
- ? options.reasoningEffort
940
- : this.reasoningEffort;
941
- if (effectiveReasoningEffort !== undefined) {
942
- agent.setReasoningEffort(effectiveReasoningEffort);
943
- }
944
- agent.setSummarizeReasoning(
945
- options.summarizeReasoning !== undefined
946
- ? options.summarizeReasoning
947
- : this.summarizeReasoning
948
- );
949
-
950
- let done = false;
951
- let output = "Done";
952
- const taskId = options.taskId || this.sessionManager.generateTaskId(input);
953
- // Backwards compatibility for callers that historically supplied a remote
954
- // UUID as taskId with syncRemote. Timestamped local slugs never qualify.
955
- const remoteTaskId =
956
- asRemoteTaskId(options.remoteTaskId) ||
957
- (options.syncRemote ? asRemoteTaskId(taskId) : undefined);
958
- let knowhowTaskId: string | undefined;
959
-
960
- try {
961
- // Get context for plugins
962
- const context = this.chatService?.getContext();
963
- const plugins = context?.plugins || [];
964
-
965
- // Format the prompt with plugins and chat history
966
- const formattedPrompt = await this.chatService.formatChatInput(
967
- input,
968
- plugins,
969
- chatHistory
970
- );
971
-
972
- // Create task info object
973
- let taskInfo: TaskInfo = {
974
- taskId,
975
- knowhowMessageId: options.remoteMessageId || options.messageId,
976
- knowhowTaskId: remoteTaskId,
977
- chatSessionId: options.chatSessionId,
978
- agentName,
979
- agent,
980
- initialInput: input,
981
- formattedPrompt,
982
- status: "running",
983
- startTime: Date.now(),
984
- totalCost: 0,
985
- enabledTools: agent.getEnabledToolNames(),
986
- model: agent.getModel(),
987
- provider: agent.getProvider(),
988
- reasoningEffort: agent.getReasoningEffort?.(),
989
- summarizeReasoning: agent.getSummarizeReasoning?.(),
990
- };
991
-
992
- // Add to task registry
993
- this.taskRegistry.register(taskId, taskInfo);
994
-
995
- // Save initial session
996
- this.saveSession(taskId, taskInfo, []);
997
-
998
- // Create a fresh SyncerService per agent task so that detaching from one
999
- // agent and starting another doesn't tear down the first agent's sync.
1000
- const syncer = new SyncerService();
1001
-
1002
- // Create sync task (SyncerService decides web vs fs internally)
1003
- const syncTaskId = await syncer.createTask({
1004
- taskId,
1005
- prompt: input,
1006
- remoteTaskId,
1007
- messageId: options.messageId,
1008
- syncFs: options.syncFs,
1009
- syncRemote: options.syncRemote,
1010
- agentName,
1011
- parentTaskId: options.parentTaskId,
1012
- });
1013
-
1014
- const webTaskId = syncer.getCreatedWebTaskId();
1015
- taskInfo.knowhowTaskId = webTaskId;
1016
- this.taskRegistry.register(taskId, taskInfo);
1017
-
1018
- await syncer.setupAgentSync(agent, syncTaskId);
1019
-
1020
- // Set up session update listener
1021
- const threadUpdateHandler = async (threadState: any) => {
1022
- taskInfo.totalCost = agent.getTotalCostUsd();
1023
- // Capture the live run configuration so it's persisted for an exact
1024
- // resume (including mid-run model/provider fallbacks).
1025
- taskInfo.model = agent.getModel();
1026
- taskInfo.provider = agent.getProvider();
1027
- taskInfo.reasoningEffort = agent.getReasoningEffort?.();
1028
- taskInfo.summarizeReasoning = agent.getSummarizeReasoning?.();
1029
- taskInfo.enabledTools = agent.getEnabledToolNames();
1030
- // updateSession pulls the (mutated) taskInfo from the registry.
1031
- this.updateSession(taskId, agent.getThreads());
1032
- };
1033
- agent.agentEvents.on(agent.eventTypes.threadUpdate, threadUpdateHandler);
1034
-
1035
- console.log(
1036
- Marked.parse(`**Starting ${agent.name} with task ID: ${taskId}...**`)
1037
- );
1038
- console.log(Marked.parse(`**Task:** ${input}`));
1039
-
1040
- // Initialize new task
1041
- await agent.newTask(taskId);
1042
-
1043
- // Record the parent task id on the agent so self-referential tools
1044
- // (e.g. replyToParent) can resolve who spawned this agent without
1045
- // relying solely on reading metadata.json off disk.
1046
- if (options.parentTaskId) {
1047
- agent.setParentTaskId(options.parentTaskId);
1048
- }
1049
-
1050
- // Set up message processors like in original startAgent
1051
-
1052
- // Register an override for askHuman to use CLI input method
1053
- // This keeps the askHuman tool CLI-agnostic while enabling CLI-specific behavior
1054
- // through the override system, achieving better separation of concerns
1055
- agent.tools.registerOverride(
1056
- "askHuman",
1057
- async (originalArgs: any[], originalTool: any) => {
1058
- const question = originalArgs[0];
1059
-
1060
- // Use CLI-specific input method from CliChatService
1061
- const chatService = this.chatService;
1062
- if (!chatService) {
1063
- throw new Error("ChatService not available in tools context");
1064
- }
1065
- console.log("AI has asked: ");
1066
- console.log(Marked.parse(question), "\n");
1067
- return await chatService.getInput("response: ");
1068
- },
1069
- 10 // Priority level
1070
- );
1071
-
1072
- const caching = [
1073
- new ToolResponseCache(agent.tools).createProcessor(),
1074
- new TokenCompressor(agent.tools).createProcessor((msg) =>
1075
- Boolean(msg.role === "tool" && msg.tool_call_id)
1076
- ),
1077
- ];
1078
-
1079
- const customVariables = new CustomVariables(agent.tools);
1080
-
1081
- agent.messageProcessor.setProcessors("pre_call", [
1082
- new Base64ImageProcessor(agent.tools).createProcessor(),
1083
- ...caching,
1084
- customVariables.createProcessor(),
1085
- ]);
1086
-
1087
- agent.messageProcessor.setProcessors("post_call", [
1088
- new XmlToolCallProcessor().createProcessor(),
1089
- new HarmonyToolProcessor().createProcessor(),
1090
- new GemmaToolProcessor().createProcessor(),
1091
- ]);
1092
-
1093
- agent.messageProcessor.setProcessors("pre_tools", [
1094
- new MinimalToolsMessageProcessor().createProcessor(),
1095
- ]);
1096
-
1097
- agent.messageProcessor.setProcessors("post_tools", [
1098
- new Base64ImageProcessor(agent.tools).createProcessor(),
1099
- ...caching,
1100
- customVariables.createRepetitionHintProcessor(),
1101
- ]);
1102
-
1103
- // Set up event listeners
1104
- // Each task gets a fresh agent instance (via createAgent), so no stale listeners exist.
1105
- const agentLogHandler = (logData: any) => {
1106
- this.renderer.render({
1107
- type: "log",
1108
- taskId,
1109
- agentName: logData.agentName,
1110
- message: logData.message,
1111
- level: logData.level,
1112
- timestamp: logData.timestamp,
1113
- });
1114
- };
1115
- const agentStatusHandler = (statusData: any) => {
1116
- this.renderer.render({
1117
- type: "agentStatus",
1118
- taskId,
1119
- agentName: statusData.agentName,
1120
- statusMessage: statusData.statusMessage,
1121
- details: statusData.details,
1122
- timestamp: statusData.timestamp,
1123
- });
1124
- };
1125
-
1126
- agent.agentEvents.on(agent.eventTypes.agentLog, agentLogHandler);
1127
- agent.agentEvents.on(agent.eventTypes.agentStatus, agentStatusHandler);
1128
-
1129
- // Wire tool call / tool result / agent message rendering so that all
1130
- // renderer types (including PlainRenderer for non-TTY) receive events
1131
- // even when running via the CLI `knowhow agent` command (which uses
1132
- // run:true and does NOT go through attachedAgentChatLoop / wireAgentRendering).
1133
- const toolCallHandler = (data: any) => {
1134
- this.renderer.render({
1135
- type: "toolCall",
1136
- taskId,
1137
- agentName: agent.name,
1138
- toolCall: data.toolCall,
1139
- });
1140
- };
1141
- const toolResultHandler = (data: any) => {
1142
- this.renderer.render({
1143
- type: "toolResult",
1144
- taskId,
1145
- agentName: agent.name,
1146
- toolCall: data.toolCall,
1147
- result: data.functionResp,
1148
- });
1149
- // Give the done event a chance to render the same answer first. If the
1150
- // agent continues, the tool result becomes the fallback output.
1151
- const toolName: string = data.toolCall?.function?.name ?? "";
1152
- if (toolName === "finalAnswer" || toolName.endsWith("finalAnswer")) {
1153
- this.scheduleFinalAnswer(taskId, data.functionResp);
1154
- }
1155
- };
1156
- const agentSayHandler = (data: any) => {
1157
- this.renderer.render({
1158
- type: "agentMessage",
1159
- taskId,
1160
- agentName: agent.name,
1161
- message: data.message,
1162
- role: "assistant",
1163
- });
1164
- };
1165
- // Only register these inline render listeners for the direct CLI path
1166
- // (options.run === true). The interactive chat / resume / attach paths
1167
- // call attachedAgentChatLoop -> wireAgentRendering, which registers its
1168
- // own keyed render listeners. Registering both would render every
1169
- // toolCall / toolResult / agentMessage twice.
1170
- if (options.run) {
1171
- if (agent.eventTypes.toolCall) {
1172
- agent.agentEvents.on(agent.eventTypes.toolCall, toolCallHandler);
1173
- }
1174
- if (agent.eventTypes.toolUsed) {
1175
- agent.agentEvents.on(agent.eventTypes.toolUsed, toolResultHandler);
1176
- }
1177
- if (agent.eventTypes.agentSay) {
1178
- agent.agentEvents.on(agent.eventTypes.agentSay, agentSayHandler);
1179
- }
1180
- }
1181
- // Track the active task on the renderer so it doesn't filter out events
1182
- this.renderer.setActiveTaskId(taskId);
1183
- this.activeAgentTaskId = taskId;
1184
-
1185
- const taskCompleted = new Promise<string>((resolve) => {
1186
- agent.agentEvents.once(agent.eventTypes.done, async (doneMsg) => {
1187
- console.log("🎯 [AgentModule] Task Completed");
1188
- this.cancelFinalAnswer(taskId);
1189
- done = true;
1190
- output = doneMsg || "No response from the AI";
1191
- // Remove threadUpdate listener to prevent cost sharing across tasks
1192
- agent.agentEvents.removeListener(
1193
- agent.eventTypes.threadUpdate,
1194
- threadUpdateHandler
1195
- );
1196
- // Remove task-specific listeners so they don't fire for the next task
1197
- agent.agentEvents.removeListener(
1198
- agent.eventTypes.agentLog,
1199
- agentLogHandler
1200
- );
1201
- agent.agentEvents.removeListener(
1202
- agent.eventTypes.agentStatus,
1203
- agentStatusHandler
1204
- );
1205
- // Update task info
1206
- taskInfo = this.taskRegistry.get(taskId);
1207
- // Remove tool rendering listeners
1208
- if (agent.eventTypes.toolCall) {
1209
- agent.agentEvents.removeListener(agent.eventTypes.toolCall, toolCallHandler);
1210
- }
1211
- if (agent.eventTypes.toolUsed) {
1212
- agent.agentEvents.removeListener(agent.eventTypes.toolUsed, toolResultHandler);
1213
- }
1214
- if (agent.eventTypes.agentSay) {
1215
- agent.agentEvents.removeListener(agent.eventTypes.agentSay, agentSayHandler);
1216
- }
1217
- // Clear active task on renderer
1218
- this.renderer.setActiveTaskId(undefined);
1219
- this.activeAgentTaskId = undefined;
1220
-
1221
- // Wait for AgentSync to finish before resolving
1222
- await syncer.waitForFinalization();
1223
-
1224
- if (taskInfo) {
1225
- taskInfo.status = "completed";
1226
- // Update final cost from agent
1227
- taskInfo.totalCost = agent.getTotalCostUsd();
1228
- // Update session with final state
1229
- this.updateSession(taskId, agent.getThreads());
1230
- taskInfo.endTime = Date.now();
1231
- }
1232
-
1233
- console.log(Marked.parse(output));
1234
- console.log("🎯 [AgentModule] Task Complete");
1235
- resolve(doneMsg);
1236
- });
1237
- });
1238
-
1239
- // Set up time limit if provided
1240
- if (options.maxTimeLimit) {
1241
- agent.setMaxRunTime(options.maxTimeLimit * 60 * 1000); // Convert minutes to milliseconds
1242
- }
1243
-
1244
- console.log(`🤖 Starting agent: ${options.agentName}`);
1245
- console.log(`📝 Task: ${options.input}`);
1246
-
1247
- if (options.maxTimeLimit) {
1248
- console.log(`⏱️ Time limit: ${options.maxTimeLimit} minutes`);
1249
- }
1250
- if (options.maxSpendLimit) {
1251
- console.log(`💰 Spend limit: $${options.maxSpendLimit}`);
1252
- }
1253
- console.log("─".repeat(50));
1254
-
1255
- if (options.run) {
1256
- agent.call(formattedPrompt);
1257
- }
1258
-
1259
- return {
1260
- agent,
1261
- taskId,
1262
- formattedPrompt,
1263
- initialInput: input,
1264
- taskCompleted,
1265
- };
1266
- } catch (error) {
1267
- console.error("Agent setup failed:", error);
1268
- this.taskRegistry.delete(taskId);
1269
- }
1270
- }
1271
-
1272
- public async loadThreadsForTask(taskId: string, messageId?: string) {
1273
- const resumeTaskId: string = taskId;
1274
- const localMetadataPath = path.join(
1275
- ".knowhow",
1276
- "processes",
1277
- "agents",
1278
- resumeTaskId,
1279
- "metadata.json"
1280
- );
1281
-
1282
- let threads: Message[][] = [];
1283
-
1284
- // Try local FS first
1285
- if (!messageId && fs.existsSync(localMetadataPath)) {
1286
- try {
1287
- const raw = await fsPromises.readFile(localMetadataPath, "utf-8");
1288
- const metadata = JSON.parse(raw);
1289
- threads = metadata.threads || [];
1290
- console.log(`📁 Loaded threads from local FS: ${localMetadataPath}`);
1291
- } catch (e) {
1292
- console.warn(`⚠️ Failed to parse local metadata: ${e.message}`);
1293
- }
1294
- } else {
1295
- // Try remote via KnowhowSimpleClient
1296
- try {
1297
- const client = new KnowhowSimpleClient();
1298
- threads = await client.getTaskThreads(resumeTaskId);
1299
- console.log(`🌐 Loaded threads from remote for task: ${resumeTaskId}`);
1300
- } catch (e) {
1301
- console.warn(`⚠️ Could not load threads from remote: ${e.message}`);
1302
- }
1303
- }
1304
-
1305
- return threads;
1306
- }
1307
-
1308
- /**
1309
- * Load the persisted run settings (model / provider / reasoning) for a task
1310
- * from local FS metadata, so a headless --resume can restore the exact
1311
- * configuration the original run used instead of falling back to agent
1312
- * defaults. Returns an empty object when no local metadata is found (e.g.
1313
- * remote-only tasks).
1314
- */
1315
- public async loadTaskSettings(
1316
- taskId: string,
1317
- messageId?: string
1318
- ): Promise<{
1319
- model?: string;
1320
- provider?: string;
1321
- reasoningEffort?: CompletionOptions["reasoning_effort"];
1322
- summarizeReasoning?: boolean;
1323
- agentName?: string;
1324
- remoteTaskId?: string;
1325
- enabledTools?: string[];
1326
- }> {
1327
- const localMetadataPath = path.join(
1328
- ".knowhow",
1329
- "processes",
1330
- "agents",
1331
- taskId,
1332
- "metadata.json"
1333
- );
1334
-
1335
- if (!messageId && fs.existsSync(localMetadataPath)) {
1336
- try {
1337
- const raw = await fsPromises.readFile(localMetadataPath, "utf-8");
1338
- const metadata = JSON.parse(raw);
1339
- return {
1340
- model: metadata.model,
1341
- provider: metadata.provider,
1342
- reasoningEffort: metadata.reasoningEffort,
1343
- summarizeReasoning: metadata.summarizeReasoning,
1344
- agentName: metadata.agentName,
1345
- remoteTaskId: asRemoteTaskId(
1346
- metadata.remoteTaskId || metadata.knowhowTaskId
1347
- ),
1348
- enabledTools: Array.isArray(metadata.enabledTools)
1349
- ? metadata.enabledTools
1350
- : undefined,
1351
- };
1352
- } catch (e) {
1353
- console.warn(`⚠️ Failed to parse local metadata for settings: ${e.message}`);
1354
- }
1355
- }
1356
-
1357
- return {};
1358
- }
1359
-
1360
- /**
1361
- * Resume an agent from a set of existing message threads
1362
- * Used by `knowhow agents resume` and interactive history commands.
1363
- */
1364
- public async resumeFromMessages(options: {
1365
- agentName: string;
1366
- input: string;
1367
- threads: Message[][];
1368
- messageId?: string;
1369
- taskId?: string;
1370
- remoteTaskId?: string;
1371
- syncFs?: boolean;
1372
- interactive?: boolean;
1373
- // Restore the exact model/provider/reasoning/tools the original run used.
1374
- model?: string;
1375
- provider?: string;
1376
- reasoningEffort?: CompletionOptions["reasoning_effort"];
1377
- summarizeReasoning?: boolean;
1378
- enabledTools?: string[];
1379
- rollback?: number;
1380
- fork?: boolean;
1381
- }): Promise<{ taskCompleted: Promise<string>; taskId: string }> {
1382
- const { agentName, input, threads, messageId, taskId } = options;
1383
- const action = options.fork ? "forking" : "resuming";
1384
-
1385
- const remoteTaskId = asRemoteTaskId(options.remoteTaskId);
1386
- // Try to extract the original request from the first user message in threads
1387
- let originalRequest = "";
1388
- if (threads && threads.length > 0) {
1389
- const firstThread = threads[0];
1390
- if (Array.isArray(firstThread)) {
1391
- const firstUserMsg = firstThread.find(
1392
- (m: any) => m.role === "user" && m.content
1393
- );
1394
- if (firstUserMsg) {
1395
- originalRequest =
1396
- typeof firstUserMsg.content === "string"
1397
- ? firstUserMsg.content
1398
- : JSON.stringify(firstUserMsg.content);
1399
- }
1400
- }
1401
- }
1402
-
1403
- // Build the resume prompt
1404
- const resumePrompt = [
1405
- `You are ${action} a previously started task.`,
1406
- originalRequest ? `ORIGINAL REQUEST: ${originalRequest}` : "",
1407
- "Please continue from where you left off.",
1408
- input ? input : "",
1409
- ]
1410
- .filter(Boolean)
1411
- .join("\n");
1412
-
1413
- // Roll back at assistant boundaries so tool calls and their results are
1414
- // removed together, never leaving an invalid orphaned tool message.
1415
- const rolledBackThreads = rollbackAgentInteractions(
1416
- threads || [],
1417
- options.rollback || 0
1418
- );
1419
- const lastThread =
1420
- rolledBackThreads.length > 0
1421
- ? rolledBackThreads[rolledBackThreads.length - 1]
1422
- : [];
1423
- const resumeMessages = [...lastThread];
1424
-
1425
- // find last user message index
1426
- const resumeIndex = [...lastThread]
1427
- .reverse()
1428
- .findIndex((e) => e.role === "user" && typeof e.content === "string");
1429
-
1430
- if (resumeIndex === -1) {
1431
- resumeMessages.push({
1432
- role: "user",
1433
- content: resumePrompt,
1434
- });
1435
- } else {
1436
- const actualIndex = resumeMessages.length - 1 - resumeIndex;
1437
- resumeMessages[actualIndex] = {
1438
- ...resumeMessages[actualIndex],
1439
- content: `${resumeMessages[actualIndex].content}\n\n<Workflow>[RESUME CONTEXT]: ${resumePrompt}</Workflow>`,
1440
- };
1441
- }
1442
-
1443
- const result = await this.setupAgent({
1444
- agentName,
1445
- input: resumePrompt,
1446
- // An existing task UUID always wins. messageId is only the create-new
1447
- // path when there is no remote task to reattach to.
1448
- messageId: remoteTaskId ? undefined : messageId,
1449
- remoteMessageId: remoteTaskId ? messageId : undefined,
1450
- taskId,
1451
- syncFs: options.syncFs,
1452
- remoteTaskId,
1453
- run: false,
1454
- syncRemote: !options.fork && !!remoteTaskId,
1455
- model: options.model,
1456
- provider: options.provider,
1457
- reasoningEffort: options.reasoningEffort,
1458
- summarizeReasoning: options.summarizeReasoning,
1459
- enabledTools: options.enabledTools,
1460
- });
1461
-
1462
- // Interactive (chat REPL) resume: route through the attached chat loop so the
1463
- // renderer is wired the same way as a normal chat interaction / /attach, and
1464
- // the user gets agent:attached mode commands (/poke, /detach, /kill, /logs).
1465
- if (options.interactive) {
1466
- // A local-only historical task has no remote UUID to reattach to. When
1467
- // auto-sync is enabled, create the remote task through the exact same
1468
- // path used for a newly started interactive thread.
1469
- if (
1470
- !options.fork &&
1471
- !remoteTaskId &&
1472
- this.remoteSyncModule?.isAutoSyncEnabled()
1473
- ) {
1474
- this.remoteSyncModule.syncTaskInBackground(result.taskId);
1475
- }
1476
-
1477
- await this.attachedAgentChatLoop(
1478
- result.taskId,
1479
- result.agent,
1480
- resumePrompt,
1481
- resumeMessages
1482
- );
1483
- return {
1484
- taskCompleted: result.taskCompleted,
1485
- taskId: result.taskId,
1486
- };
1487
- }
1488
-
1489
- // Non-interactive (headless CLI `knowhow agents resume`) path: setupAgent was
1490
- // called with run:false, so no inline render listeners were registered. Wire
1491
- // rendering here (same keyed listeners as attachedAgentChatLoop) so the CLI
1492
- // still shows the agent's messages / tool calls, then start the agent.
1493
- this.wireAgentRendering(
1494
- result.taskId,
1495
- result.agent.agentEvents,
1496
- result.agent.eventTypes,
1497
- result.agent.name
1498
- );
1499
- result.agent.call(resumePrompt, resumeMessages);
1500
-
1501
- return { taskCompleted: result.taskCompleted, taskId: result.taskId };
1502
- }
1503
-
1504
- /**
1505
- * Get list of active agent tasks
1506
- */
1507
- getActiveTasks(): { taskId: string; agent: TaskInfo }[] {
1508
- return Array.from(this.taskRegistry.getEntries()).map(
1509
- ([taskId, taskInfo]) => ({
1510
- taskId,
1511
- agent: taskInfo,
1512
- })
1513
- );
1514
- }
1515
-
1516
- /**
1517
- * Attach to an existing agent task
1518
- */
1519
- attachToTask(taskId: string): boolean {
1520
- if (this.taskRegistry.has(taskId)) {
1521
- console.log(Marked.parse(`**Attached to agent task: ${taskId}**`));
1522
- return true;
1523
- }
1524
- console.log(
1525
- Marked.parse(`**Task ${taskId} not found or already completed.**`)
1526
- );
1527
- return false;
1528
- }
1529
-
1530
- /**
1531
- * Save session to file
1532
- */
1533
- private saveSession(
1534
- taskId: string,
1535
- taskInfo: TaskInfo,
1536
- threads: any[]
1537
- ): void {
1538
- this.sessionManager.saveSession(taskId, taskInfo, threads);
1539
- }
1540
-
1541
- /**
1542
- * Update existing session with new thread state
1543
- */
1544
- private updateSession(taskId: string, threads: any[]): void {
1545
- const taskInfo = this.taskRegistry.get(taskId);
1546
- this.sessionManager.updateSession(taskId, taskInfo, threads);
1547
- }
1548
-
1549
- /**
1550
- * Start an agent with an initial task (simplified version for now)
1551
- */
1552
- private async startAgent(
1553
- selectedAgent: BaseAgent,
1554
- initialInput: string,
1555
- chatHistory: ChatInteraction[] = []
1556
- ) {
1557
- try {
1558
- const { agent, taskId, formattedPrompt } = await this.setupAgent({
1559
- agentName: selectedAgent.name,
1560
- input: initialInput,
1561
- chatHistory,
1562
- model: selectedAgent.getModel(),
1563
- provider: selectedAgent.getProvider() as any,
1564
- run: false, // Don't run yet, we need to set up event listeners first
1565
- });
1566
-
1567
- // If auto-sync is enabled, push this task to the remote KnowHow app
1568
- if (this.remoteSyncModule?.isAutoSyncEnabled()) {
1569
- this.remoteSyncModule.syncTaskInBackground(taskId);
1570
- }
1571
-
1572
- await this.attachedAgentChatLoop(taskId, agent, formattedPrompt);
1573
-
1574
- return { taskId };
1575
- } catch (error) {
1576
- console.error("Error starting agent:", error);
1577
- }
1578
- }
1579
-
1580
- async attachedAgentChatLoop(
1581
- taskId: string,
1582
- agent: AttachableAgent,
1583
- initialInput?: string,
1584
- initialMessages?: any[]
1585
- ): Promise<void> {
1586
- try {
1587
- let agentFinalOutput: string | undefined;
1588
-
1589
- // Set mode to agent:attached so mode-specific commands are available
1590
- if (this.chatService) {
1591
- this.chatService.setMode("agent:attached");
1592
- }
1593
-
1594
- // Wire up rendering event listeners and track the active task
1595
- this.wireAgentRendering(
1596
- taskId,
1597
- agent.agentEvents,
1598
- agent.eventTypes,
1599
- agent.name
1600
- );
1601
- const context = this.chatService?.getContext();
1602
- if (context) context.activeAgentTaskId = taskId;
1603
-
1604
- // Store the agent so the registered agent:attached commands can reference it
1605
- this.attachedAgent = agent;
1606
-
1607
- // Set up the event listener BEFORE starting the agent to avoid race condition
1608
- const donePromise = new Promise<string>((resolve) => {
1609
- agent.agentEvents.once(agent.eventTypes.done, (doneMsg) => {
1610
- // Capture the agent's final output
1611
- agentFinalOutput = doneMsg || "No response from the AI";
1612
- console.log("Finished", taskId, `$${agent.getTotalCostUsd()}`);
1613
-
1614
- // Update final task status
1615
- const finalTaskInfo = this.taskRegistry.get(taskId);
1616
- if (finalTaskInfo) {
1617
- if (finalTaskInfo.status === "running") {
1618
- finalTaskInfo.status = "completed";
1619
- finalTaskInfo.totalCost = agent.getTotalCostUsd();
1620
- finalTaskInfo.endTime = Date.now();
1621
- }
1622
- }
1623
-
1624
- if (context.chatHistory) {
1625
- const found = context.chatHistory.find((h) => h.taskId === taskId);
1626
- if (found) found.output = agentFinalOutput;
1627
- }
1628
-
1629
- resolve("done");
1630
- // Exit agent:attached mode so the prompt resets back to the default.
1631
- // Only detach if we are still attached to THIS agent. If the user
1632
- // killed this agent and started a new one (or /attached to a different
1633
- // one) while this agent was finishing a long tool call, calling
1634
- // detachFromAgent() unconditionally would rip out the new agent's
1635
- // rendering listeners and reset the mode, making new output invisible.
1636
- if (this.attachedAgent === agent) {
1637
- this.detachFromAgent();
1638
- }
1639
- });
1640
- });
1641
-
1642
- // Now start the agent if we have an initial input (this means we're starting, not just attaching)
1643
- if (initialInput) {
1644
- const taskInfo = this.taskRegistry.get(taskId);
1645
- (agent as BaseAgent).call(
1646
- taskInfo?.formattedPrompt || taskInfo?.initialInput || initialInput,
1647
- initialMessages
1648
- );
1649
- }
1650
- } catch (error) {
1651
- console.error("Agent execution failed:", error);
1652
- }
1653
- }
1654
- }
1655
-
1656
- /** Accept only backend task UUIDs; local task slugs intentionally fail. */
1657
- function asRemoteTaskId(value: string | undefined): string | undefined {
1658
- return value &&
1659
- /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(
1660
- value
1661
- )
1662
- ? value
1663
- : undefined;
1664
- }