@tyvm/knowhow 0.0.158 → 0.0.160

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 (870) hide show
  1. package/package.json +2 -2
  2. package/ts_build/package.json +2 -2
  3. package/ts_build/src/chat/CliChatService.d.ts +2 -1
  4. package/ts_build/src/chat/CliChatService.js +29 -3
  5. package/ts_build/src/chat/CliChatService.js.map +1 -1
  6. package/ts_build/src/chat/modules/AgentModule.js +21 -17
  7. package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
  8. package/ts_build/src/chat/renderer/ConsoleRenderer.js +32 -25
  9. package/ts_build/src/chat/renderer/ConsoleRenderer.js.map +1 -1
  10. package/ts_build/src/logger.d.ts +1 -0
  11. package/ts_build/src/logger.js +13 -1
  12. package/ts_build/src/logger.js.map +1 -1
  13. package/ts_build/src/utils/InputQueueManager.d.ts +8 -1
  14. package/ts_build/src/utils/InputQueueManager.js +72 -2
  15. package/ts_build/src/utils/InputQueueManager.js.map +1 -1
  16. package/ts_build/src/utils/index.d.ts +3 -1
  17. package/ts_build/src/utils/index.js +11 -3
  18. package/ts_build/src/utils/index.js.map +1 -1
  19. package/CONFIG.md +0 -429
  20. package/PROCESSING.md +0 -450
  21. package/WORKER.md +0 -260
  22. package/autodoc/README.md +0 -324
  23. package/autodoc/chat-guide.md +0 -444
  24. package/autodoc/cli-reference.md +0 -720
  25. package/autodoc/config-reference.md +0 -642
  26. package/autodoc/embeddings-guide.md +0 -467
  27. package/autodoc/generate-guide.md +0 -437
  28. package/autodoc/language-plugin-guide.md +0 -417
  29. package/autodoc/modules-guide.md +0 -379
  30. package/autodoc/plugins-guide.md +0 -721
  31. package/autodoc/quickstart-guide.md +0 -126
  32. package/autodoc/skills-guide.md +0 -584
  33. package/autodoc/worker-guide.md +0 -519
  34. package/docs/input-queue-manager.md +0 -142
  35. package/docs/multi-worker-management.md +0 -142
  36. package/docs/shell-commands.md +0 -174
  37. package/jest.config.js +0 -19
  38. package/jest.manual.config.js +0 -19
  39. package/scripts/README.md +0 -119
  40. package/scripts/build-for-node.sh +0 -148
  41. package/scripts/cache-miss-debug.ts +0 -365
  42. package/scripts/check-isolated-deps.sh +0 -69
  43. package/scripts/check-model-pricing.ts +0 -509
  44. package/scripts/compare-openrouter-coverage.ts +0 -576
  45. package/scripts/migrate-usage-json.js +0 -147
  46. package/scripts/publish.sh +0 -86
  47. package/scripts/restore_keys.sh +0 -59
  48. package/scripts/test-repetition-hint.ts +0 -302
  49. package/scripts/unset_keys.sh +0 -60
  50. package/src/agents/base/base.ts +0 -1963
  51. package/src/agents/base/prompt.ts +0 -55
  52. package/src/agents/configurable/ConfigAgent.ts +0 -24
  53. package/src/agents/developer/developer.ts +0 -76
  54. package/src/agents/historyRollback.ts +0 -36
  55. package/src/agents/index.ts +0 -52
  56. package/src/agents/interface.ts +0 -11
  57. package/src/agents/patcher/codebase.md +0 -27
  58. package/src/agents/patcher/patcher.ts +0 -131
  59. package/src/agents/researcher/researcher.ts +0 -115
  60. package/src/agents/setup/setup.ts +0 -63
  61. package/src/agents/tools/addInternalTools.ts +0 -21
  62. package/src/agents/tools/agentCall.ts +0 -34
  63. package/src/agents/tools/aiClient.ts +0 -178
  64. package/src/agents/tools/askHuman.ts +0 -10
  65. package/src/agents/tools/callPlugin.ts +0 -10
  66. package/src/agents/tools/connectAgent.ts +0 -355
  67. package/src/agents/tools/embeddingSearch.ts +0 -6
  68. package/src/agents/tools/execCommand.ts +0 -162
  69. package/src/agents/tools/fileSearch.ts +0 -35
  70. package/src/agents/tools/finalAnswer.ts +0 -4
  71. package/src/agents/tools/googleSearch.ts +0 -243
  72. package/src/agents/tools/index.ts +0 -33
  73. package/src/agents/tools/language/definitions.ts +0 -105
  74. package/src/agents/tools/language/index.ts +0 -20
  75. package/src/agents/tools/lazy/definitions.ts +0 -72
  76. package/src/agents/tools/lazy/disableTools.ts +0 -16
  77. package/src/agents/tools/lazy/enableTools.ts +0 -16
  78. package/src/agents/tools/lazy/index.ts +0 -3
  79. package/src/agents/tools/lazy/listAvailableTools.ts +0 -17
  80. package/src/agents/tools/lintFile.ts +0 -19
  81. package/src/agents/tools/list.ts +0 -739
  82. package/src/agents/tools/loadImageAsBase64.ts +0 -83
  83. package/src/agents/tools/loadWebpage.ts +0 -19
  84. package/src/agents/tools/mcp/connectMcpServer.ts +0 -40
  85. package/src/agents/tools/mcp/definitions.ts +0 -67
  86. package/src/agents/tools/mcp/disconnectMcpServer.ts +0 -40
  87. package/src/agents/tools/mcp/index.ts +0 -3
  88. package/src/agents/tools/mcp/listAvailableMcpServers.ts +0 -28
  89. package/src/agents/tools/minimal/callTool.ts +0 -45
  90. package/src/agents/tools/minimal/definitions.ts +0 -50
  91. package/src/agents/tools/minimal/index.ts +0 -3
  92. package/src/agents/tools/minimal/inspectTools.ts +0 -27
  93. package/src/agents/tools/modifyFile.ts +0 -53
  94. package/src/agents/tools/observe.ts +0 -247
  95. package/src/agents/tools/patch.ts +0 -1287
  96. package/src/agents/tools/readBlocks.ts +0 -83
  97. package/src/agents/tools/readFile.ts +0 -105
  98. package/src/agents/tools/replyToParent.ts +0 -123
  99. package/src/agents/tools/runGenerate.ts +0 -210
  100. package/src/agents/tools/scanFile.ts +0 -16
  101. package/src/agents/tools/sendAgentMessage.ts +0 -139
  102. package/src/agents/tools/skills.ts +0 -79
  103. package/src/agents/tools/startAgentTask.ts +0 -393
  104. package/src/agents/tools/stringReplace.ts +0 -105
  105. package/src/agents/tools/textSearch.ts +0 -128
  106. package/src/agents/tools/types/fileblock.ts +0 -5
  107. package/src/agents/tools/visionTool.ts +0 -35
  108. package/src/agents/tools/waitForAgentCompleted.ts +0 -270
  109. package/src/agents/tools/writeFile.ts +0 -106
  110. package/src/agents/tools/ycmd/client.ts +0 -608
  111. package/src/agents/tools/ycmd/definitions.ts +0 -294
  112. package/src/agents/tools/ycmd/detection.ts +0 -211
  113. package/src/agents/tools/ycmd/index.ts +0 -11
  114. package/src/agents/tools/ycmd/installer.ts +0 -251
  115. package/src/agents/tools/ycmd/server.ts +0 -545
  116. package/src/agents/tools/ycmd/serverManager.ts +0 -316
  117. package/src/agents/tools/ycmd/tools/completion.ts +0 -113
  118. package/src/agents/tools/ycmd/tools/diagnostics.ts +0 -166
  119. package/src/agents/tools/ycmd/tools/getLocations.ts +0 -173
  120. package/src/agents/tools/ycmd/tools/goto.ts +0 -169
  121. package/src/agents/tools/ycmd/tools/refactor.ts +0 -204
  122. package/src/agents/tools/ycmd/tools/signature.ts +0 -174
  123. package/src/agents/tools/ycmd/tools/start.ts +0 -95
  124. package/src/agents/tools/ycmd/utils/pathUtils.ts +0 -59
  125. package/src/ai.ts +0 -306
  126. package/src/auth/browserLogin.ts +0 -406
  127. package/src/auth/environmentAuth.ts +0 -51
  128. package/src/auth/errors.ts +0 -6
  129. package/src/auth/jwtStore.ts +0 -70
  130. package/src/auth/keyAuth.ts +0 -142
  131. package/src/auth/keyManager.ts +0 -331
  132. package/src/auth/registerIdentity.ts +0 -67
  133. package/src/auth/spinner.ts +0 -23
  134. package/src/chat/CliChatService.ts +0 -438
  135. package/src/chat/modules/AgentModule.ts +0 -1664
  136. package/src/chat/modules/AskModule.ts +0 -98
  137. package/src/chat/modules/BaseChatModule.ts +0 -65
  138. package/src/chat/modules/ClipboardImageModule.ts +0 -136
  139. package/src/chat/modules/CustomCommandsModule.ts +0 -80
  140. package/src/chat/modules/InternalChatModule.ts +0 -216
  141. package/src/chat/modules/RemoteSyncModule.ts +0 -482
  142. package/src/chat/modules/RendererModule.ts +0 -139
  143. package/src/chat/modules/SearchModule.ts +0 -168
  144. package/src/chat/modules/SessionsModule.ts +0 -969
  145. package/src/chat/modules/SetupModule.ts +0 -185
  146. package/src/chat/modules/ShellCommandModule.ts +0 -98
  147. package/src/chat/modules/SystemModule.ts +0 -161
  148. package/src/chat/modules/ToolCommandModule.ts +0 -102
  149. package/src/chat/modules/VoiceModule.ts +0 -70
  150. package/src/chat/modules/index.ts +0 -8
  151. package/src/chat/renderer/CompactRenderer.ts +0 -229
  152. package/src/chat/renderer/ConsoleRenderer.ts +0 -160
  153. package/src/chat/renderer/FancyRenderer.ts +0 -440
  154. package/src/chat/renderer/PlainRenderer.ts +0 -218
  155. package/src/chat/renderer/index.ts +0 -6
  156. package/src/chat/renderer/loadRenderer.ts +0 -316
  157. package/src/chat/renderer/messagesToRenderEvents.ts +0 -96
  158. package/src/chat/renderer/types.ts +0 -99
  159. package/src/chat/types.ts +0 -146
  160. package/src/chat.ts +0 -140
  161. package/src/cli.ts +0 -180
  162. package/src/clients/anthropic.ts +0 -772
  163. package/src/clients/attribution.ts +0 -53
  164. package/src/clients/cerebras.ts +0 -10
  165. package/src/clients/contextLimits.ts +0 -263
  166. package/src/clients/copilot.ts +0 -23
  167. package/src/clients/deepseek.ts +0 -16
  168. package/src/clients/fireworks.ts +0 -71
  169. package/src/clients/gemini.ts +0 -1169
  170. package/src/clients/github.ts +0 -16
  171. package/src/clients/groq.ts +0 -15
  172. package/src/clients/http.ts +0 -719
  173. package/src/clients/index.ts +0 -1153
  174. package/src/clients/knowhow.ts +0 -130
  175. package/src/clients/knowhowMcp.ts +0 -118
  176. package/src/clients/llama.ts +0 -16
  177. package/src/clients/meta.ts +0 -27
  178. package/src/clients/mistral.ts +0 -16
  179. package/src/clients/nvidia.ts +0 -16
  180. package/src/clients/openai.ts +0 -1186
  181. package/src/clients/openrouter.ts +0 -24
  182. package/src/clients/pricing/anthropic.ts +0 -149
  183. package/src/clients/pricing/cerebras.ts +0 -11
  184. package/src/clients/pricing/copilot.ts +0 -60
  185. package/src/clients/pricing/deepseek.ts +0 -15
  186. package/src/clients/pricing/fireworks.ts +0 -182
  187. package/src/clients/pricing/github.ts +0 -69
  188. package/src/clients/pricing/google.ts +0 -385
  189. package/src/clients/pricing/groq.ts +0 -56
  190. package/src/clients/pricing/index.ts +0 -44
  191. package/src/clients/pricing/llama.ts +0 -18
  192. package/src/clients/pricing/meta.ts +0 -12
  193. package/src/clients/pricing/mistral.ts +0 -34
  194. package/src/clients/pricing/models.ts +0 -25
  195. package/src/clients/pricing/nvidia.ts +0 -102
  196. package/src/clients/pricing/openai.ts +0 -409
  197. package/src/clients/pricing/openrouter.ts +0 -36
  198. package/src/clients/pricing/qwen.ts +0 -80
  199. package/src/clients/pricing/types.ts +0 -125
  200. package/src/clients/pricing/xai.ts +0 -137
  201. package/src/clients/qwen.ts +0 -16
  202. package/src/clients/responseMetadata.ts +0 -221
  203. package/src/clients/types.ts +0 -531
  204. package/src/clients/withRetry.ts +0 -89
  205. package/src/clients/xai.ts +0 -693
  206. package/src/cloudWorker.ts +0 -394
  207. package/src/commands/agent.ts +0 -342
  208. package/src/commands/agents.ts +0 -1037
  209. package/src/commands/behaviors.ts +0 -47
  210. package/src/commands/convert.ts +0 -291
  211. package/src/commands/hash.ts +0 -179
  212. package/src/commands/mcp.ts +0 -743
  213. package/src/commands/misc.ts +0 -373
  214. package/src/commands/modules.ts +0 -704
  215. package/src/commands/processes.ts +0 -248
  216. package/src/commands/remote.ts +0 -77
  217. package/src/commands/replay.ts +0 -503
  218. package/src/commands/sandbox.ts +0 -566
  219. package/src/commands/services.ts +0 -168
  220. package/src/commands/skills.ts +0 -107
  221. package/src/commands/workers.ts +0 -168
  222. package/src/config.ts +0 -468
  223. package/src/conversion.ts +0 -69
  224. package/src/dataset/diffs/README.md +0 -12
  225. package/src/dataset/diffs/debug-errors.ts +0 -29
  226. package/src/dataset/diffs/debug.ts +0 -64
  227. package/src/dataset/diffs/generate.ts +0 -71
  228. package/src/dataset/diffs/jsonl.ts +0 -53
  229. package/src/dataset/diffs/test.ts +0 -194
  230. package/src/embeddings.ts +0 -494
  231. package/src/fileSync.ts +0 -369
  232. package/src/generate.ts +0 -529
  233. package/src/hashes.ts +0 -180
  234. package/src/index.ts +0 -261
  235. package/src/logger.ts +0 -197
  236. package/src/login.ts +0 -209
  237. package/src/microphone.ts +0 -141
  238. package/src/migrations.ts +0 -151
  239. package/src/plugins/AgentsMdPlugin.ts +0 -118
  240. package/src/plugins/GitPlugin.ts +0 -598
  241. package/src/plugins/LinterPlugin.ts +0 -214
  242. package/src/plugins/PluginBase.ts +0 -70
  243. package/src/plugins/SkillsPlugin.ts +0 -37
  244. package/src/plugins/embedding.ts +0 -82
  245. package/src/plugins/exec.ts +0 -70
  246. package/src/plugins/language.ts +0 -290
  247. package/src/plugins/plugins.ts +0 -175
  248. package/src/plugins/tmux.ts +0 -132
  249. package/src/plugins/types.ts +0 -36
  250. package/src/plugins/url.ts +0 -101
  251. package/src/plugins/vim.ts +0 -89
  252. package/src/processes/ProcessManager.ts +0 -96
  253. package/src/processes/managedProcessShim.ts +0 -138
  254. package/src/processors/Base64ImageDetector.ts +0 -502
  255. package/src/processors/CustomVariables.ts +0 -693
  256. package/src/processors/GemmaToolProcessor.ts +0 -163
  257. package/src/processors/HarmonyToolProcessor.ts +0 -264
  258. package/src/processors/JsonCompressor.ts +0 -510
  259. package/src/processors/MinimalToolsMessageProcessor.ts +0 -113
  260. package/src/processors/TokenCompressor.ts +0 -620
  261. package/src/processors/ToolResponseCache.ts +0 -322
  262. package/src/processors/XmlToolCallProcessor.ts +0 -533
  263. package/src/processors/index.ts +0 -14
  264. package/src/processors/tools/boundedToolResponse.ts +0 -49
  265. package/src/processors/tools/grepToolResponse.ts +0 -230
  266. package/src/processors/tools/index.ts +0 -23
  267. package/src/processors/tools/jqToolResponse.ts +0 -159
  268. package/src/processors/tools/listStoredToolResponses.ts +0 -124
  269. package/src/processors/tools/tailToolResponse.ts +0 -148
  270. package/src/prompts/BasicCodeDocumenter.ts +0 -1
  271. package/src/prompts/BasicProjectDocumenter.ts +0 -1
  272. package/src/prompts/EmbeddingSeachHelper.ts +0 -1
  273. package/src/prompts/KnowhowConfigExamples.ts +0 -376
  274. package/src/prompts/index.ts +0 -9
  275. package/src/remotes.ts +0 -110
  276. package/src/server/index.ts +0 -16
  277. package/src/services/AgentService.ts +0 -134
  278. package/src/services/AgentSyncFs.ts +0 -775
  279. package/src/services/AgentSyncKnowhowWeb.ts +0 -389
  280. package/src/services/BehaviorsService.ts +0 -466
  281. package/src/services/DockerService.ts +0 -511
  282. package/src/services/EmbeddingService.ts +0 -427
  283. package/src/services/EmbeddingsService.ts +0 -73
  284. package/src/services/EventService.ts +0 -279
  285. package/src/services/ExtensionsService.ts +0 -25
  286. package/src/services/KnowhowClient.ts +0 -928
  287. package/src/services/LazyToolsService.ts +0 -210
  288. package/src/services/Mcp.ts +0 -727
  289. package/src/services/McpServer.ts +0 -155
  290. package/src/services/McpWebsocketTransport.ts +0 -87
  291. package/src/services/MediaProcessorService.ts +0 -669
  292. package/src/services/MessageProcessor.ts +0 -114
  293. package/src/services/MinimalToolsService.ts +0 -177
  294. package/src/services/RuntimeReloadService.ts +0 -31
  295. package/src/services/S3.ts +0 -61
  296. package/src/services/SessionManager.ts +0 -358
  297. package/src/services/SkillsService.ts +0 -822
  298. package/src/services/SyncedAgentWatcher.ts +0 -124
  299. package/src/services/SyncerService.ts +0 -191
  300. package/src/services/TaskRegistry.ts +0 -110
  301. package/src/services/Tools.ts +0 -580
  302. package/src/services/TracingService.ts +0 -116
  303. package/src/services/conversion/ConversionService.ts +0 -757
  304. package/src/services/conversion/index.ts +0 -2
  305. package/src/services/conversion/types.ts +0 -87
  306. package/src/services/flags.ts +0 -51
  307. package/src/services/index.ts +0 -117
  308. package/src/services/modules/computerUse.ts +0 -218
  309. package/src/services/modules/index.ts +0 -314
  310. package/src/services/modules/types.ts +0 -109
  311. package/src/services/types.ts +0 -60
  312. package/src/services/watchers/FsSyncer.ts +0 -199
  313. package/src/services/watchers/RemoteSyncer.ts +0 -196
  314. package/src/services/watchers/index.ts +0 -2
  315. package/src/tunnel.ts +0 -243
  316. package/src/types.ts +0 -282
  317. package/src/util/Trace.ts +0 -236
  318. package/src/utils/InputQueueManager.ts +0 -493
  319. package/src/utils/errors.ts +0 -0
  320. package/src/utils/http.ts +0 -150
  321. package/src/utils/index.ts +0 -111
  322. package/src/worker.ts +0 -696
  323. package/src/workerRegistry.ts +0 -152
  324. package/src/workers/auth/PasskeySetup.ts +0 -181
  325. package/src/workers/auth/WorkerPasskeyAuth.ts +0 -190
  326. package/src/workers/auth/WsMiddleware.ts +0 -99
  327. package/src/workers/auth/authMiddleware.ts +0 -104
  328. package/src/workers/auth/types.ts +0 -70
  329. package/src/workers/tools/getChallenge.ts +0 -33
  330. package/src/workers/tools/index.ts +0 -20
  331. package/src/workers/tools/listAllowedPorts.ts +0 -30
  332. package/src/workers/tools/lock.ts +0 -31
  333. package/src/workers/tools/reloadConfig.ts +0 -84
  334. package/src/workers/tools/unlock.ts +0 -116
  335. package/tests/XmlToolCallProcessor.test.ts +0 -468
  336. package/tests/agents/interrupt.test.ts +0 -200
  337. package/tests/agents/observe-base.test.ts +0 -183
  338. package/tests/agents/tools/connectAgent.test.ts +0 -138
  339. package/tests/agents/tools/observe.test.ts +0 -179
  340. package/tests/agents/tools/readFile.test.ts +0 -88
  341. package/tests/agents/tools/replyToParent.test.ts +0 -125
  342. package/tests/agents/tools/sendAgentMessage.test.ts +0 -99
  343. package/tests/agents/tools/waitForAgentCompleted.test.ts +0 -147
  344. package/tests/chat/detach-attach-rendering.test.ts +0 -315
  345. package/tests/clients/AIClient.test.ts +0 -668
  346. package/tests/clients/anthropic.test.ts +0 -202
  347. package/tests/clients/contextLimits.test.ts +0 -97
  348. package/tests/clients/fireworks.test.ts +0 -65
  349. package/tests/clients/openai.images.test.ts +0 -105
  350. package/tests/clients/pricing.test.ts +0 -206
  351. package/tests/clients/reasoningEffort.test.ts +0 -140
  352. package/tests/compressor/bigstring.test.ts +0 -450
  353. package/tests/compressor/bigstring.txt +0 -1
  354. package/tests/compressor/githubjson.txt +0 -1
  355. package/tests/compressor/toolResponseCache.test.ts +0 -304
  356. package/tests/compressor/usageBase64.json +0 -159
  357. package/tests/compressor/usageBase64.test.ts +0 -175
  358. package/tests/fixtures/fake-secret.txt +0 -1
  359. package/tests/manual/agent-events/run-test.ts +0 -203
  360. package/tests/manual/browser-login/README.md +0 -189
  361. package/tests/manual/browser-login/test_browser_login_basic.ts +0 -115
  362. package/tests/manual/browser-login/test_cli_integration.ts +0 -169
  363. package/tests/manual/browser-login/test_cross_platform_browser.ts +0 -186
  364. package/tests/manual/browser-login/test_error_scenarios.ts +0 -223
  365. package/tests/manual/cli/no-env.sh +0 -274
  366. package/tests/manual/clients/completions.json +0 -1151
  367. package/tests/manual/clients/completions.test.ts +0 -198
  368. package/tests/manual/file-edits/figma.test.ts +0 -3
  369. package/tests/manual/file-edits/fileblocks/readwrite.test.ts +0 -100
  370. package/tests/manual/file-edits/patching/input.txt +0 -145
  371. package/tests/manual/file-edits/patching/output.txt +0 -145
  372. package/tests/manual/file-edits/patching/patch.txt +0 -15
  373. package/tests/manual/file-edits/patching/unseen.txt +0 -80
  374. package/tests/manual/file-edits/patching.test.ts +0 -139
  375. package/tests/manual/modalities/README.md +0 -157
  376. package/tests/manual/modalities/google.modalities.test.ts +0 -335
  377. package/tests/manual/modalities/openai.modalities.test.ts +0 -329
  378. package/tests/manual/modalities/streaming.test.ts +0 -260
  379. package/tests/manual/modalities/xai.modalities.test.ts +0 -294
  380. package/tests/manual/test-concurrent-ask.ts +0 -43
  381. package/tests/manual/ycmd/debug_diagnostics_test.ts +0 -127
  382. package/tests/manual/ycmd/fixtures/debug_diagnostics.ts +0 -26
  383. package/tests/manual/ycmd/fixtures/file_change_test.ts +0 -17
  384. package/tests/manual/ycmd/minimal_advanced_test.ts +0 -108
  385. package/tests/manual/ycmd/simple_diagnostics_test.ts +0 -61
  386. package/tests/manual/ycmd/simple_test.ts +0 -74
  387. package/tests/manual/ycmd/test-typescript-sample.ts +0 -34
  388. package/tests/manual/ycmd/test_advanced_features.ts +0 -407
  389. package/tests/manual/ycmd/test_advanced_with_tools.ts +0 -320
  390. package/tests/manual/ycmd/test_comprehensive_typescript.ts +0 -179
  391. package/tests/manual/ycmd/test_diagnostics_file_changes.ts +0 -249
  392. package/tests/manual/ycmd/test_diagnostics_fix.ts +0 -99
  393. package/tests/manual/ycmd/test_diagnostics_simple.ts +0 -100
  394. package/tests/manual/ycmd/test_diagnostics_timing.ts +0 -120
  395. package/tests/manual/ycmd/test_discover_commands.ts +0 -310
  396. package/tests/manual/ycmd/test_endpoints.ts +0 -115
  397. package/tests/manual/ycmd/test_final_comprehensive.ts +0 -218
  398. package/tests/manual/ycmd/test_final_validation.ts +0 -150
  399. package/tests/manual/ycmd/test_implementation.js +0 -42
  400. package/tests/manual/ycmd/test_individual_ycmd_tool.ts +0 -39
  401. package/tests/manual/ycmd/test_server_manager.ts +0 -52
  402. package/tests/manual/ycmd/test_simple_debug.ts +0 -86
  403. package/tests/manual/ycmd/test_tsserver_workflow.js +0 -83
  404. package/tests/manual/ycmd/test_tsserver_workflow.ts +0 -122
  405. package/tests/manual/ycmd/test_typescript_simple.ts +0 -48
  406. package/tests/manual/ycmd/test_typescript_ycmd.ts +0 -105
  407. package/tests/manual/ycmd/test_workspace_config.ts +0 -90
  408. package/tests/manual/ycmd/test_ycmd_auto_start.ts +0 -137
  409. package/tests/manual/ycmd/test_ycmd_comprehensive.ts +0 -73
  410. package/tests/manual/ycmd/test_ycmd_connection.py +0 -10
  411. package/tests/manual/ycmd/test_ycmd_direct.ts +0 -142
  412. package/tests/manual/ycmd/test_ycmd_experiment.ts +0 -48
  413. package/tests/manual/ycmd/test_ycmd_final.ts +0 -200
  414. package/tests/manual/ycmd/test_ycmd_fixed.py +0 -18
  415. package/tests/manual/ycmd/test_ycmd_integration.ts +0 -112
  416. package/tests/manual/ycmd/test_ycmd_simple.ts +0 -45
  417. package/tests/manual/ycmd/test_ycmd_usage.py +0 -27
  418. package/tests/manual/ycmd/working_simple_test.ts +0 -134
  419. package/tests/patching/corrupted.test.ts +0 -78
  420. package/tests/patching/fixtures/transcript-mangles/agent-sync-fs-nested-catch.json +0 -9
  421. package/tests/patching/fixtures/transcript-mangles/automation-functions-crossed.json +0 -9
  422. package/tests/patching/fixtures/transcript-mangles/fruit-ninja-confirmed-retirement.json +0 -8
  423. package/tests/patching/imports.patch.txt +0 -11
  424. package/tests/patching/imports.test.ts +0 -43
  425. package/tests/patching/imports.txt +0 -11
  426. package/tests/patching/interface.patch.txt +0 -15
  427. package/tests/patching/interface.txt +0 -7
  428. package/tests/patching/patchFileOutput.test.ts +0 -328
  429. package/tests/patching/regression-2026.test.ts +0 -752
  430. package/tests/patching/transcriptMangleRegression.test.ts +0 -125
  431. package/tests/plugins/language/languagePlugin-content-triggers.test.ts +0 -346
  432. package/tests/plugins/language/languagePlugin-integration.test.ts +0 -471
  433. package/tests/plugins/language/languagePlugin.test.ts +0 -385
  434. package/tests/processes/managedProcessShim.test.ts +0 -59
  435. package/tests/processors/Base64ImageDetector.test.ts +0 -979
  436. package/tests/processors/CustomVariables.test.ts +0 -981
  437. package/tests/processors/CustomVariablesBenchmark.test.ts +0 -237
  438. package/tests/processors/HarmonyToolProcessor.test.ts +0 -490
  439. package/tests/processors/TokenCompressor.test.ts +0 -674
  440. package/tests/processors/ToolResponseCache.test.ts +0 -864
  441. package/tests/processors/tools/boundedRetrievalTools.test.ts +0 -68
  442. package/tests/processors/tools/grepToolResponse.test.ts +0 -159
  443. package/tests/services/ConversionService.test.ts +0 -154
  444. package/tests/services/DockerService.test.ts +0 -24
  445. package/tests/services/Tools.test.ts +0 -1738
  446. package/tests/services/ToolsService.setFunction.test.ts +0 -68
  447. package/tests/services/WorkerReloadConfig.test.ts +0 -141
  448. package/tests/test.spec.ts +0 -163
  449. package/tests/unit/InputQueueManager.test.ts +0 -174
  450. package/tests/unit/McpWebsocketTransport.test.ts +0 -56
  451. package/tests/unit/agents/historyRollback.test.ts +0 -53
  452. package/tests/unit/agents/tools/loadImageAsBase64.test.ts +0 -44
  453. package/tests/unit/auth/jwtStore.test.ts +0 -55
  454. package/tests/unit/auth/keyAuth.test.ts +0 -152
  455. package/tests/unit/auth/keyManager.test.ts +0 -130
  456. package/tests/unit/auth/registerIdentity.test.ts +0 -99
  457. package/tests/unit/chat/ToolCommandModule.test.ts +0 -71
  458. package/tests/unit/chat/historyCommandArgs.test.ts +0 -37
  459. package/tests/unit/clients/AIClient.test.ts +0 -454
  460. package/tests/unit/clients/anthropic.responseMetadata.test.ts +0 -81
  461. package/tests/unit/clients/attribution.test.ts +0 -185
  462. package/tests/unit/clients/http.responseMetadata.test.ts +0 -86
  463. package/tests/unit/clients/openai.responseMetadata.test.ts +0 -90
  464. package/tests/unit/clients/responseMetadata.test.ts +0 -123
  465. package/tests/unit/clients/withRetry.test.ts +0 -319
  466. package/tests/unit/commands/agents.test.ts +0 -111
  467. package/tests/unit/commands/github-credentials.test.ts +0 -210
  468. package/tests/unit/commands/misc.test.ts +0 -85
  469. package/tests/unit/commands/remote.test.ts +0 -79
  470. package/tests/unit/commands/sandbox.test.ts +0 -350
  471. package/tests/unit/hashes.test.ts +0 -23
  472. package/tests/unit/input-queue.test.ts +0 -80
  473. package/tests/unit/login.test.ts +0 -218
  474. package/tests/unit/modules/moduleLoading.test.ts +0 -305
  475. package/tests/unit/plugins/pluginLoading.test.ts +0 -97
  476. package/tests/unit/services/AgentSyncKnowhowWeb.test.ts +0 -38
  477. package/tests/unit/services/KnowhowClient.test.ts +0 -84
  478. package/tests/unit/services/LazyToolsService.test.ts +0 -53
  479. package/tests/unit/services/Mcp.test.ts +0 -56
  480. package/tests/unit/services/MinimalToolsService.test.ts +0 -424
  481. package/tests/unit/services/RuntimeReloadService.test.ts +0 -29
  482. package/tests/unit/services/SessionManager.test.ts +0 -43
  483. package/tests/unit/services/SyncedAgentWatcher.test.ts +0 -89
  484. package/tests/unit/services/SyncerService.test.ts +0 -45
  485. package/tests/unit/tunnel.test.ts +0 -51
  486. package/tests/unit/util/Trace.test.ts +0 -119
  487. package/tests/unit/utils/http.test.ts +0 -43
  488. package/ts_build/tests/XmlToolCallProcessor.test.d.ts +0 -1
  489. package/ts_build/tests/XmlToolCallProcessor.test.js +0 -376
  490. package/ts_build/tests/XmlToolCallProcessor.test.js.map +0 -1
  491. package/ts_build/tests/agents/interrupt.test.d.ts +0 -14
  492. package/ts_build/tests/agents/interrupt.test.js +0 -136
  493. package/ts_build/tests/agents/interrupt.test.js.map +0 -1
  494. package/ts_build/tests/agents/observe-base.test.d.ts +0 -1
  495. package/ts_build/tests/agents/observe-base.test.js +0 -149
  496. package/ts_build/tests/agents/observe-base.test.js.map +0 -1
  497. package/ts_build/tests/agents/tools/connectAgent.test.d.ts +0 -1
  498. package/ts_build/tests/agents/tools/connectAgent.test.js +0 -142
  499. package/ts_build/tests/agents/tools/connectAgent.test.js.map +0 -1
  500. package/ts_build/tests/agents/tools/observe.test.d.ts +0 -1
  501. package/ts_build/tests/agents/tools/observe.test.js +0 -148
  502. package/ts_build/tests/agents/tools/observe.test.js.map +0 -1
  503. package/ts_build/tests/agents/tools/readFile.test.d.ts +0 -1
  504. package/ts_build/tests/agents/tools/readFile.test.js +0 -90
  505. package/ts_build/tests/agents/tools/readFile.test.js.map +0 -1
  506. package/ts_build/tests/agents/tools/replyToParent.test.d.ts +0 -1
  507. package/ts_build/tests/agents/tools/replyToParent.test.js +0 -116
  508. package/ts_build/tests/agents/tools/replyToParent.test.js.map +0 -1
  509. package/ts_build/tests/agents/tools/sendAgentMessage.test.d.ts +0 -1
  510. package/ts_build/tests/agents/tools/sendAgentMessage.test.js +0 -112
  511. package/ts_build/tests/agents/tools/sendAgentMessage.test.js.map +0 -1
  512. package/ts_build/tests/agents/tools/waitForAgentCompleted.test.d.ts +0 -1
  513. package/ts_build/tests/agents/tools/waitForAgentCompleted.test.js +0 -147
  514. package/ts_build/tests/agents/tools/waitForAgentCompleted.test.js.map +0 -1
  515. package/ts_build/tests/chat/detach-attach-rendering.test.d.ts +0 -1
  516. package/ts_build/tests/chat/detach-attach-rendering.test.js +0 -168
  517. package/ts_build/tests/chat/detach-attach-rendering.test.js.map +0 -1
  518. package/ts_build/tests/clients/AIClient.test.d.ts +0 -1
  519. package/ts_build/tests/clients/AIClient.test.js +0 -483
  520. package/ts_build/tests/clients/AIClient.test.js.map +0 -1
  521. package/ts_build/tests/clients/anthropic.test.d.ts +0 -1
  522. package/ts_build/tests/clients/anthropic.test.js +0 -159
  523. package/ts_build/tests/clients/anthropic.test.js.map +0 -1
  524. package/ts_build/tests/clients/contextLimits.test.d.ts +0 -1
  525. package/ts_build/tests/clients/contextLimits.test.js +0 -69
  526. package/ts_build/tests/clients/contextLimits.test.js.map +0 -1
  527. package/ts_build/tests/clients/fireworks.test.d.ts +0 -1
  528. package/ts_build/tests/clients/fireworks.test.js +0 -65
  529. package/ts_build/tests/clients/fireworks.test.js.map +0 -1
  530. package/ts_build/tests/clients/openai.images.test.d.ts +0 -1
  531. package/ts_build/tests/clients/openai.images.test.js +0 -94
  532. package/ts_build/tests/clients/openai.images.test.js.map +0 -1
  533. package/ts_build/tests/clients/pricing.test.d.ts +0 -1
  534. package/ts_build/tests/clients/pricing.test.js +0 -124
  535. package/ts_build/tests/clients/pricing.test.js.map +0 -1
  536. package/ts_build/tests/clients/reasoningEffort.test.d.ts +0 -1
  537. package/ts_build/tests/clients/reasoningEffort.test.js +0 -116
  538. package/ts_build/tests/clients/reasoningEffort.test.js.map +0 -1
  539. package/ts_build/tests/compressor/bigstring.test.d.ts +0 -1
  540. package/ts_build/tests/compressor/bigstring.test.js +0 -275
  541. package/ts_build/tests/compressor/bigstring.test.js.map +0 -1
  542. package/ts_build/tests/compressor/toolResponseCache.test.d.ts +0 -1
  543. package/ts_build/tests/compressor/toolResponseCache.test.js +0 -250
  544. package/ts_build/tests/compressor/toolResponseCache.test.js.map +0 -1
  545. package/ts_build/tests/compressor/usageBase64.test.d.ts +0 -1
  546. package/ts_build/tests/compressor/usageBase64.test.js +0 -109
  547. package/ts_build/tests/compressor/usageBase64.test.js.map +0 -1
  548. package/ts_build/tests/manual/agent-events/run-test.d.ts +0 -2
  549. package/ts_build/tests/manual/agent-events/run-test.js +0 -148
  550. package/ts_build/tests/manual/agent-events/run-test.js.map +0 -1
  551. package/ts_build/tests/manual/browser-login/test_browser_login_basic.d.ts +0 -2
  552. package/ts_build/tests/manual/browser-login/test_browser_login_basic.js +0 -118
  553. package/ts_build/tests/manual/browser-login/test_browser_login_basic.js.map +0 -1
  554. package/ts_build/tests/manual/browser-login/test_cli_integration.d.ts +0 -2
  555. package/ts_build/tests/manual/browser-login/test_cli_integration.js +0 -163
  556. package/ts_build/tests/manual/browser-login/test_cli_integration.js.map +0 -1
  557. package/ts_build/tests/manual/browser-login/test_cross_platform_browser.d.ts +0 -2
  558. package/ts_build/tests/manual/browser-login/test_cross_platform_browser.js +0 -169
  559. package/ts_build/tests/manual/browser-login/test_cross_platform_browser.js.map +0 -1
  560. package/ts_build/tests/manual/browser-login/test_error_scenarios.d.ts +0 -2
  561. package/ts_build/tests/manual/browser-login/test_error_scenarios.js +0 -207
  562. package/ts_build/tests/manual/browser-login/test_error_scenarios.js.map +0 -1
  563. package/ts_build/tests/manual/clients/completions.test.d.ts +0 -1
  564. package/ts_build/tests/manual/clients/completions.test.js +0 -151
  565. package/ts_build/tests/manual/clients/completions.test.js.map +0 -1
  566. package/ts_build/tests/manual/file-edits/figma.test.d.ts +0 -0
  567. package/ts_build/tests/manual/file-edits/figma.test.js +0 -2
  568. package/ts_build/tests/manual/file-edits/figma.test.js.map +0 -1
  569. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.d.ts +0 -1
  570. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js +0 -110
  571. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js.map +0 -1
  572. package/ts_build/tests/manual/file-edits/patching.test.d.ts +0 -1
  573. package/ts_build/tests/manual/file-edits/patching.test.js +0 -129
  574. package/ts_build/tests/manual/file-edits/patching.test.js.map +0 -1
  575. package/ts_build/tests/manual/modalities/google.modalities.test.d.ts +0 -1
  576. package/ts_build/tests/manual/modalities/google.modalities.test.js +0 -262
  577. package/ts_build/tests/manual/modalities/google.modalities.test.js.map +0 -1
  578. package/ts_build/tests/manual/modalities/openai.modalities.test.d.ts +0 -1
  579. package/ts_build/tests/manual/modalities/openai.modalities.test.js +0 -262
  580. package/ts_build/tests/manual/modalities/openai.modalities.test.js.map +0 -1
  581. package/ts_build/tests/manual/modalities/streaming.test.d.ts +0 -1
  582. package/ts_build/tests/manual/modalities/streaming.test.js +0 -216
  583. package/ts_build/tests/manual/modalities/streaming.test.js.map +0 -1
  584. package/ts_build/tests/manual/modalities/xai.modalities.test.d.ts +0 -1
  585. package/ts_build/tests/manual/modalities/xai.modalities.test.js +0 -219
  586. package/ts_build/tests/manual/modalities/xai.modalities.test.js.map +0 -1
  587. package/ts_build/tests/manual/test-concurrent-ask.d.ts +0 -1
  588. package/ts_build/tests/manual/test-concurrent-ask.js +0 -22
  589. package/ts_build/tests/manual/test-concurrent-ask.js.map +0 -1
  590. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.d.ts +0 -1
  591. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js +0 -124
  592. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js.map +0 -1
  593. package/ts_build/tests/manual/ycmd/minimal_advanced_test.d.ts +0 -2
  594. package/ts_build/tests/manual/ycmd/minimal_advanced_test.js +0 -114
  595. package/ts_build/tests/manual/ycmd/minimal_advanced_test.js.map +0 -1
  596. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.d.ts +0 -1
  597. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js +0 -84
  598. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js.map +0 -1
  599. package/ts_build/tests/manual/ycmd/simple_test.d.ts +0 -2
  600. package/ts_build/tests/manual/ycmd/simple_test.js +0 -92
  601. package/ts_build/tests/manual/ycmd/simple_test.js.map +0 -1
  602. package/ts_build/tests/manual/ycmd/test-typescript-sample.d.ts +0 -14
  603. package/ts_build/tests/manual/ycmd/test-typescript-sample.js +0 -20
  604. package/ts_build/tests/manual/ycmd/test-typescript-sample.js.map +0 -1
  605. package/ts_build/tests/manual/ycmd/test_advanced_features.d.ts +0 -2
  606. package/ts_build/tests/manual/ycmd/test_advanced_features.js +0 -306
  607. package/ts_build/tests/manual/ycmd/test_advanced_features.js.map +0 -1
  608. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.d.ts +0 -3
  609. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js +0 -271
  610. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js.map +0 -1
  611. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.d.ts +0 -2
  612. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js +0 -196
  613. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js.map +0 -1
  614. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.d.ts +0 -1
  615. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js +0 -184
  616. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js.map +0 -1
  617. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.d.ts +0 -2
  618. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js +0 -116
  619. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js.map +0 -1
  620. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.d.ts +0 -1
  621. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js +0 -114
  622. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js.map +0 -1
  623. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.d.ts +0 -1
  624. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js +0 -129
  625. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js.map +0 -1
  626. package/ts_build/tests/manual/ycmd/test_discover_commands.d.ts +0 -2
  627. package/ts_build/tests/manual/ycmd/test_discover_commands.js +0 -252
  628. package/ts_build/tests/manual/ycmd/test_discover_commands.js.map +0 -1
  629. package/ts_build/tests/manual/ycmd/test_endpoints.d.ts +0 -2
  630. package/ts_build/tests/manual/ycmd/test_endpoints.js +0 -130
  631. package/ts_build/tests/manual/ycmd/test_endpoints.js.map +0 -1
  632. package/ts_build/tests/manual/ycmd/test_final_comprehensive.d.ts +0 -2
  633. package/ts_build/tests/manual/ycmd/test_final_comprehensive.js +0 -231
  634. package/ts_build/tests/manual/ycmd/test_final_comprehensive.js.map +0 -1
  635. package/ts_build/tests/manual/ycmd/test_final_validation.d.ts +0 -2
  636. package/ts_build/tests/manual/ycmd/test_final_validation.js +0 -170
  637. package/ts_build/tests/manual/ycmd/test_final_validation.js.map +0 -1
  638. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.d.ts +0 -2
  639. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js +0 -37
  640. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js.map +0 -1
  641. package/ts_build/tests/manual/ycmd/test_server_manager.d.ts +0 -1
  642. package/ts_build/tests/manual/ycmd/test_server_manager.js +0 -38
  643. package/ts_build/tests/manual/ycmd/test_server_manager.js.map +0 -1
  644. package/ts_build/tests/manual/ycmd/test_simple_debug.d.ts +0 -2
  645. package/ts_build/tests/manual/ycmd/test_simple_debug.js +0 -109
  646. package/ts_build/tests/manual/ycmd/test_simple_debug.js.map +0 -1
  647. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.d.ts +0 -1
  648. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js +0 -138
  649. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js.map +0 -1
  650. package/ts_build/tests/manual/ycmd/test_typescript_simple.d.ts +0 -1
  651. package/ts_build/tests/manual/ycmd/test_typescript_simple.js +0 -76
  652. package/ts_build/tests/manual/ycmd/test_typescript_simple.js.map +0 -1
  653. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.d.ts +0 -1
  654. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js +0 -115
  655. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js.map +0 -1
  656. package/ts_build/tests/manual/ycmd/test_workspace_config.d.ts +0 -1
  657. package/ts_build/tests/manual/ycmd/test_workspace_config.js +0 -99
  658. package/ts_build/tests/manual/ycmd/test_workspace_config.js.map +0 -1
  659. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.d.ts +0 -2
  660. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js +0 -140
  661. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js.map +0 -1
  662. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.d.ts +0 -1
  663. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js +0 -93
  664. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js.map +0 -1
  665. package/ts_build/tests/manual/ycmd/test_ycmd_direct.d.ts +0 -2
  666. package/ts_build/tests/manual/ycmd/test_ycmd_direct.js +0 -159
  667. package/ts_build/tests/manual/ycmd/test_ycmd_direct.js.map +0 -1
  668. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.d.ts +0 -15
  669. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js +0 -68
  670. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js.map +0 -1
  671. package/ts_build/tests/manual/ycmd/test_ycmd_final.d.ts +0 -2
  672. package/ts_build/tests/manual/ycmd/test_ycmd_final.js +0 -205
  673. package/ts_build/tests/manual/ycmd/test_ycmd_final.js.map +0 -1
  674. package/ts_build/tests/manual/ycmd/test_ycmd_integration.d.ts +0 -3
  675. package/ts_build/tests/manual/ycmd/test_ycmd_integration.js +0 -119
  676. package/ts_build/tests/manual/ycmd/test_ycmd_integration.js.map +0 -1
  677. package/ts_build/tests/manual/ycmd/test_ycmd_simple.d.ts +0 -2
  678. package/ts_build/tests/manual/ycmd/test_ycmd_simple.js +0 -36
  679. package/ts_build/tests/manual/ycmd/test_ycmd_simple.js.map +0 -1
  680. package/ts_build/tests/manual/ycmd/working_simple_test.d.ts +0 -2
  681. package/ts_build/tests/manual/ycmd/working_simple_test.js +0 -144
  682. package/ts_build/tests/manual/ycmd/working_simple_test.js.map +0 -1
  683. package/ts_build/tests/patching/corrupted.test.d.ts +0 -1
  684. package/ts_build/tests/patching/corrupted.test.js +0 -53
  685. package/ts_build/tests/patching/corrupted.test.js.map +0 -1
  686. package/ts_build/tests/patching/imports.test.d.ts +0 -1
  687. package/ts_build/tests/patching/imports.test.js +0 -71
  688. package/ts_build/tests/patching/imports.test.js.map +0 -1
  689. package/ts_build/tests/patching/patchFileOutput.test.d.ts +0 -1
  690. package/ts_build/tests/patching/patchFileOutput.test.js +0 -269
  691. package/ts_build/tests/patching/patchFileOutput.test.js.map +0 -1
  692. package/ts_build/tests/patching/regression-2026.test.d.ts +0 -1
  693. package/ts_build/tests/patching/regression-2026.test.js +0 -528
  694. package/ts_build/tests/patching/regression-2026.test.js.map +0 -1
  695. package/ts_build/tests/patching/transcriptMangleRegression.test.d.ts +0 -1
  696. package/ts_build/tests/patching/transcriptMangleRegression.test.js +0 -104
  697. package/ts_build/tests/patching/transcriptMangleRegression.test.js.map +0 -1
  698. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.d.ts +0 -1
  699. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +0 -294
  700. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +0 -1
  701. package/ts_build/tests/plugins/language/languagePlugin-integration.test.d.ts +0 -1
  702. package/ts_build/tests/plugins/language/languagePlugin-integration.test.js +0 -343
  703. package/ts_build/tests/plugins/language/languagePlugin-integration.test.js.map +0 -1
  704. package/ts_build/tests/plugins/language/languagePlugin.test.d.ts +0 -1
  705. package/ts_build/tests/plugins/language/languagePlugin.test.js +0 -315
  706. package/ts_build/tests/plugins/language/languagePlugin.test.js.map +0 -1
  707. package/ts_build/tests/processes/managedProcessShim.test.d.ts +0 -1
  708. package/ts_build/tests/processes/managedProcessShim.test.js +0 -92
  709. package/ts_build/tests/processes/managedProcessShim.test.js.map +0 -1
  710. package/ts_build/tests/processors/Base64ImageDetector.test.d.ts +0 -1
  711. package/ts_build/tests/processors/Base64ImageDetector.test.js +0 -792
  712. package/ts_build/tests/processors/Base64ImageDetector.test.js.map +0 -1
  713. package/ts_build/tests/processors/CustomVariables.test.d.ts +0 -1
  714. package/ts_build/tests/processors/CustomVariables.test.js +0 -764
  715. package/ts_build/tests/processors/CustomVariables.test.js.map +0 -1
  716. package/ts_build/tests/processors/CustomVariablesBenchmark.test.d.ts +0 -1
  717. package/ts_build/tests/processors/CustomVariablesBenchmark.test.js +0 -179
  718. package/ts_build/tests/processors/CustomVariablesBenchmark.test.js.map +0 -1
  719. package/ts_build/tests/processors/HarmonyToolProcessor.test.d.ts +0 -1
  720. package/ts_build/tests/processors/HarmonyToolProcessor.test.js +0 -382
  721. package/ts_build/tests/processors/HarmonyToolProcessor.test.js.map +0 -1
  722. package/ts_build/tests/processors/TokenCompressor.test.d.ts +0 -1
  723. package/ts_build/tests/processors/TokenCompressor.test.js +0 -473
  724. package/ts_build/tests/processors/TokenCompressor.test.js.map +0 -1
  725. package/ts_build/tests/processors/ToolResponseCache.test.d.ts +0 -1
  726. package/ts_build/tests/processors/ToolResponseCache.test.js +0 -657
  727. package/ts_build/tests/processors/ToolResponseCache.test.js.map +0 -1
  728. package/ts_build/tests/processors/tools/boundedRetrievalTools.test.d.ts +0 -1
  729. package/ts_build/tests/processors/tools/boundedRetrievalTools.test.js +0 -57
  730. package/ts_build/tests/processors/tools/boundedRetrievalTools.test.js.map +0 -1
  731. package/ts_build/tests/processors/tools/grepToolResponse.test.d.ts +0 -1
  732. package/ts_build/tests/processors/tools/grepToolResponse.test.js +0 -77
  733. package/ts_build/tests/processors/tools/grepToolResponse.test.js.map +0 -1
  734. package/ts_build/tests/services/ConversionService.test.d.ts +0 -1
  735. package/ts_build/tests/services/ConversionService.test.js +0 -154
  736. package/ts_build/tests/services/ConversionService.test.js.map +0 -1
  737. package/ts_build/tests/services/DockerService.test.d.ts +0 -1
  738. package/ts_build/tests/services/DockerService.test.js +0 -22
  739. package/ts_build/tests/services/DockerService.test.js.map +0 -1
  740. package/ts_build/tests/services/Tools.test.d.ts +0 -1
  741. package/ts_build/tests/services/Tools.test.js +0 -1365
  742. package/ts_build/tests/services/Tools.test.js.map +0 -1
  743. package/ts_build/tests/services/ToolsService.setFunction.test.d.ts +0 -1
  744. package/ts_build/tests/services/ToolsService.setFunction.test.js +0 -51
  745. package/ts_build/tests/services/ToolsService.setFunction.test.js.map +0 -1
  746. package/ts_build/tests/services/WorkerReloadConfig.test.d.ts +0 -1
  747. package/ts_build/tests/services/WorkerReloadConfig.test.js +0 -86
  748. package/ts_build/tests/services/WorkerReloadConfig.test.js.map +0 -1
  749. package/ts_build/tests/test.spec.d.ts +0 -1
  750. package/ts_build/tests/test.spec.js +0 -139
  751. package/ts_build/tests/test.spec.js.map +0 -1
  752. package/ts_build/tests/unit/InputQueueManager.test.d.ts +0 -1
  753. package/ts_build/tests/unit/InputQueueManager.test.js +0 -104
  754. package/ts_build/tests/unit/InputQueueManager.test.js.map +0 -1
  755. package/ts_build/tests/unit/McpWebsocketTransport.test.d.ts +0 -1
  756. package/ts_build/tests/unit/McpWebsocketTransport.test.js +0 -47
  757. package/ts_build/tests/unit/McpWebsocketTransport.test.js.map +0 -1
  758. package/ts_build/tests/unit/agents/historyRollback.test.d.ts +0 -1
  759. package/ts_build/tests/unit/agents/historyRollback.test.js +0 -42
  760. package/ts_build/tests/unit/agents/historyRollback.test.js.map +0 -1
  761. package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.d.ts +0 -1
  762. package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.js +0 -67
  763. package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.js.map +0 -1
  764. package/ts_build/tests/unit/auth/jwtStore.test.d.ts +0 -1
  765. package/ts_build/tests/unit/auth/jwtStore.test.js +0 -46
  766. package/ts_build/tests/unit/auth/jwtStore.test.js.map +0 -1
  767. package/ts_build/tests/unit/auth/keyAuth.test.d.ts +0 -1
  768. package/ts_build/tests/unit/auth/keyAuth.test.js +0 -118
  769. package/ts_build/tests/unit/auth/keyAuth.test.js.map +0 -1
  770. package/ts_build/tests/unit/auth/keyManager.test.d.ts +0 -1
  771. package/ts_build/tests/unit/auth/keyManager.test.js +0 -96
  772. package/ts_build/tests/unit/auth/keyManager.test.js.map +0 -1
  773. package/ts_build/tests/unit/auth/registerIdentity.test.d.ts +0 -1
  774. package/ts_build/tests/unit/auth/registerIdentity.test.js +0 -92
  775. package/ts_build/tests/unit/auth/registerIdentity.test.js.map +0 -1
  776. package/ts_build/tests/unit/chat/ToolCommandModule.test.d.ts +0 -1
  777. package/ts_build/tests/unit/chat/ToolCommandModule.test.js +0 -61
  778. package/ts_build/tests/unit/chat/ToolCommandModule.test.js.map +0 -1
  779. package/ts_build/tests/unit/chat/historyCommandArgs.test.d.ts +0 -1
  780. package/ts_build/tests/unit/chat/historyCommandArgs.test.js +0 -29
  781. package/ts_build/tests/unit/chat/historyCommandArgs.test.js.map +0 -1
  782. package/ts_build/tests/unit/clients/AIClient.test.d.ts +0 -1
  783. package/ts_build/tests/unit/clients/AIClient.test.js +0 -342
  784. package/ts_build/tests/unit/clients/AIClient.test.js.map +0 -1
  785. package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.d.ts +0 -1
  786. package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.js +0 -77
  787. package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.js.map +0 -1
  788. package/ts_build/tests/unit/clients/attribution.test.d.ts +0 -1
  789. package/ts_build/tests/unit/clients/attribution.test.js +0 -153
  790. package/ts_build/tests/unit/clients/attribution.test.js.map +0 -1
  791. package/ts_build/tests/unit/clients/http.responseMetadata.test.d.ts +0 -1
  792. package/ts_build/tests/unit/clients/http.responseMetadata.test.js +0 -77
  793. package/ts_build/tests/unit/clients/http.responseMetadata.test.js.map +0 -1
  794. package/ts_build/tests/unit/clients/openai.responseMetadata.test.d.ts +0 -1
  795. package/ts_build/tests/unit/clients/openai.responseMetadata.test.js +0 -86
  796. package/ts_build/tests/unit/clients/openai.responseMetadata.test.js.map +0 -1
  797. package/ts_build/tests/unit/clients/responseMetadata.test.d.ts +0 -1
  798. package/ts_build/tests/unit/clients/responseMetadata.test.js +0 -96
  799. package/ts_build/tests/unit/clients/responseMetadata.test.js.map +0 -1
  800. package/ts_build/tests/unit/clients/withRetry.test.d.ts +0 -1
  801. package/ts_build/tests/unit/clients/withRetry.test.js +0 -225
  802. package/ts_build/tests/unit/clients/withRetry.test.js.map +0 -1
  803. package/ts_build/tests/unit/commands/agents.test.d.ts +0 -1
  804. package/ts_build/tests/unit/commands/agents.test.js +0 -119
  805. package/ts_build/tests/unit/commands/agents.test.js.map +0 -1
  806. package/ts_build/tests/unit/commands/github-credentials.test.d.ts +0 -1
  807. package/ts_build/tests/unit/commands/github-credentials.test.js +0 -145
  808. package/ts_build/tests/unit/commands/github-credentials.test.js.map +0 -1
  809. package/ts_build/tests/unit/commands/misc.test.d.ts +0 -1
  810. package/ts_build/tests/unit/commands/misc.test.js +0 -70
  811. package/ts_build/tests/unit/commands/misc.test.js.map +0 -1
  812. package/ts_build/tests/unit/commands/remote.test.d.ts +0 -1
  813. package/ts_build/tests/unit/commands/remote.test.js +0 -70
  814. package/ts_build/tests/unit/commands/remote.test.js.map +0 -1
  815. package/ts_build/tests/unit/commands/sandbox.test.d.ts +0 -1
  816. package/ts_build/tests/unit/commands/sandbox.test.js +0 -258
  817. package/ts_build/tests/unit/commands/sandbox.test.js.map +0 -1
  818. package/ts_build/tests/unit/hashes.test.d.ts +0 -1
  819. package/ts_build/tests/unit/hashes.test.js +0 -25
  820. package/ts_build/tests/unit/hashes.test.js.map +0 -1
  821. package/ts_build/tests/unit/input-queue.test.d.ts +0 -1
  822. package/ts_build/tests/unit/input-queue.test.js +0 -32
  823. package/ts_build/tests/unit/input-queue.test.js.map +0 -1
  824. package/ts_build/tests/unit/login.test.d.ts +0 -1
  825. package/ts_build/tests/unit/login.test.js +0 -166
  826. package/ts_build/tests/unit/login.test.js.map +0 -1
  827. package/ts_build/tests/unit/modules/moduleLoading.test.d.ts +0 -1
  828. package/ts_build/tests/unit/modules/moduleLoading.test.js +0 -272
  829. package/ts_build/tests/unit/modules/moduleLoading.test.js.map +0 -1
  830. package/ts_build/tests/unit/plugins/pluginLoading.test.d.ts +0 -1
  831. package/ts_build/tests/unit/plugins/pluginLoading.test.js +0 -117
  832. package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +0 -1
  833. package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.d.ts +0 -1
  834. package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js +0 -32
  835. package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js.map +0 -1
  836. package/ts_build/tests/unit/services/KnowhowClient.test.d.ts +0 -1
  837. package/ts_build/tests/unit/services/KnowhowClient.test.js +0 -69
  838. package/ts_build/tests/unit/services/KnowhowClient.test.js.map +0 -1
  839. package/ts_build/tests/unit/services/LazyToolsService.test.d.ts +0 -1
  840. package/ts_build/tests/unit/services/LazyToolsService.test.js +0 -47
  841. package/ts_build/tests/unit/services/LazyToolsService.test.js.map +0 -1
  842. package/ts_build/tests/unit/services/Mcp.test.d.ts +0 -1
  843. package/ts_build/tests/unit/services/Mcp.test.js +0 -45
  844. package/ts_build/tests/unit/services/Mcp.test.js.map +0 -1
  845. package/ts_build/tests/unit/services/MinimalToolsService.test.d.ts +0 -1
  846. package/ts_build/tests/unit/services/MinimalToolsService.test.js +0 -320
  847. package/ts_build/tests/unit/services/MinimalToolsService.test.js.map +0 -1
  848. package/ts_build/tests/unit/services/RuntimeReloadService.test.d.ts +0 -1
  849. package/ts_build/tests/unit/services/RuntimeReloadService.test.js +0 -26
  850. package/ts_build/tests/unit/services/RuntimeReloadService.test.js.map +0 -1
  851. package/ts_build/tests/unit/services/SessionManager.test.d.ts +0 -1
  852. package/ts_build/tests/unit/services/SessionManager.test.js +0 -72
  853. package/ts_build/tests/unit/services/SessionManager.test.js.map +0 -1
  854. package/ts_build/tests/unit/services/SyncedAgentWatcher.test.d.ts +0 -1
  855. package/ts_build/tests/unit/services/SyncedAgentWatcher.test.js +0 -78
  856. package/ts_build/tests/unit/services/SyncedAgentWatcher.test.js.map +0 -1
  857. package/ts_build/tests/unit/services/SyncerService.test.d.ts +0 -1
  858. package/ts_build/tests/unit/services/SyncerService.test.js +0 -40
  859. package/ts_build/tests/unit/services/SyncerService.test.js.map +0 -1
  860. package/ts_build/tests/unit/tunnel.test.d.ts +0 -1
  861. package/ts_build/tests/unit/tunnel.test.js +0 -47
  862. package/ts_build/tests/unit/tunnel.test.js.map +0 -1
  863. package/ts_build/tests/unit/util/Trace.test.d.ts +0 -1
  864. package/ts_build/tests/unit/util/Trace.test.js +0 -107
  865. package/ts_build/tests/unit/util/Trace.test.js.map +0 -1
  866. package/ts_build/tests/unit/utils/http.test.d.ts +0 -1
  867. package/ts_build/tests/unit/utils/http.test.js +0 -69
  868. package/ts_build/tests/unit/utils/http.test.js.map +0 -1
  869. package/tsconfig.json +0 -34
  870. 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
- }