@tyvm/knowhow 0.0.159 → 0.0.161
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/package.json +2 -2
- package/ts_build/package.json +2 -2
- package/ts_build/src/chat/CliChatService.d.ts +2 -1
- package/ts_build/src/chat/CliChatService.js +29 -3
- package/ts_build/src/chat/CliChatService.js.map +1 -1
- package/ts_build/src/chat/modules/AgentModule.js +21 -17
- package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
- package/ts_build/src/chat/renderer/ConsoleRenderer.js +32 -25
- package/ts_build/src/chat/renderer/ConsoleRenderer.js.map +1 -1
- package/ts_build/src/clients/anthropic.js +4 -1
- package/ts_build/src/clients/anthropic.js.map +1 -1
- package/ts_build/src/clients/contextLimits.js +13 -7
- package/ts_build/src/clients/contextLimits.js.map +1 -1
- package/ts_build/src/clients/index.js +3 -1
- package/ts_build/src/clients/index.js.map +1 -1
- package/ts_build/src/clients/openai.js +18 -5
- package/ts_build/src/clients/openai.js.map +1 -1
- package/ts_build/src/clients/pricing/anthropic.d.ts +2 -0
- package/ts_build/src/clients/pricing/anthropic.js +21 -1
- package/ts_build/src/clients/pricing/anthropic.js.map +1 -1
- package/ts_build/src/clients/pricing/openai.d.ts +2 -0
- package/ts_build/src/clients/pricing/openai.js +32 -7
- package/ts_build/src/clients/pricing/openai.js.map +1 -1
- package/ts_build/src/clients/pricing/types.d.ts +4 -0
- package/ts_build/src/clients/pricing/types.js.map +1 -1
- package/ts_build/src/clients/pricing/xai.d.ts +2 -0
- package/ts_build/src/clients/pricing/xai.js +13 -8
- package/ts_build/src/clients/pricing/xai.js.map +1 -1
- package/ts_build/src/clients/xai.js +20 -8
- package/ts_build/src/clients/xai.js.map +1 -1
- package/ts_build/src/commands/misc.js +15 -2
- package/ts_build/src/commands/misc.js.map +1 -1
- package/ts_build/src/logger.d.ts +1 -0
- package/ts_build/src/logger.js +13 -1
- package/ts_build/src/logger.js.map +1 -1
- package/ts_build/src/remotes.d.ts +2 -0
- package/ts_build/src/remotes.js +20 -2
- package/ts_build/src/remotes.js.map +1 -1
- package/ts_build/src/tunnel.js +7 -2
- package/ts_build/src/tunnel.js.map +1 -1
- package/ts_build/src/types.d.ts +12 -1
- package/ts_build/src/types.js.map +1 -1
- package/ts_build/src/utils/InputQueueManager.d.ts +8 -1
- package/ts_build/src/utils/InputQueueManager.js +74 -3
- package/ts_build/src/utils/InputQueueManager.js.map +1 -1
- package/ts_build/src/utils/index.d.ts +3 -1
- package/ts_build/src/utils/index.js +11 -3
- package/ts_build/src/utils/index.js.map +1 -1
- package/ts_build/src/worker.js +4 -1
- package/ts_build/src/worker.js.map +1 -1
- package/ts_build/src/workers/tools/listAllowedPorts.d.ts +2 -1
- package/ts_build/src/workers/tools/listAllowedPorts.js +1 -1
- package/ts_build/src/workers/tools/listAllowedPorts.js.map +1 -1
- package/CONFIG.md +0 -429
- package/PROCESSING.md +0 -450
- package/WORKER.md +0 -260
- package/autodoc/README.md +0 -324
- package/autodoc/chat-guide.md +0 -444
- package/autodoc/cli-reference.md +0 -720
- package/autodoc/config-reference.md +0 -642
- package/autodoc/embeddings-guide.md +0 -467
- package/autodoc/generate-guide.md +0 -437
- package/autodoc/language-plugin-guide.md +0 -417
- package/autodoc/modules-guide.md +0 -379
- package/autodoc/plugins-guide.md +0 -721
- package/autodoc/quickstart-guide.md +0 -126
- package/autodoc/skills-guide.md +0 -584
- package/autodoc/worker-guide.md +0 -519
- package/docs/input-queue-manager.md +0 -142
- package/docs/multi-worker-management.md +0 -142
- package/docs/shell-commands.md +0 -174
- package/jest.config.js +0 -19
- package/jest.manual.config.js +0 -19
- package/scripts/README.md +0 -119
- package/scripts/build-for-node.sh +0 -148
- package/scripts/cache-miss-debug.ts +0 -365
- package/scripts/check-isolated-deps.sh +0 -69
- package/scripts/check-model-pricing.ts +0 -509
- package/scripts/compare-openrouter-coverage.ts +0 -576
- package/scripts/migrate-usage-json.js +0 -147
- package/scripts/publish.sh +0 -86
- package/scripts/restore_keys.sh +0 -59
- package/scripts/test-repetition-hint.ts +0 -302
- package/scripts/unset_keys.sh +0 -60
- package/src/agents/base/base.ts +0 -1963
- package/src/agents/base/prompt.ts +0 -55
- package/src/agents/configurable/ConfigAgent.ts +0 -24
- package/src/agents/developer/developer.ts +0 -76
- package/src/agents/historyRollback.ts +0 -36
- package/src/agents/index.ts +0 -52
- package/src/agents/interface.ts +0 -11
- package/src/agents/patcher/codebase.md +0 -27
- package/src/agents/patcher/patcher.ts +0 -131
- package/src/agents/researcher/researcher.ts +0 -115
- package/src/agents/setup/setup.ts +0 -63
- package/src/agents/tools/addInternalTools.ts +0 -21
- package/src/agents/tools/agentCall.ts +0 -34
- package/src/agents/tools/aiClient.ts +0 -178
- package/src/agents/tools/askHuman.ts +0 -10
- package/src/agents/tools/callPlugin.ts +0 -10
- package/src/agents/tools/connectAgent.ts +0 -355
- package/src/agents/tools/embeddingSearch.ts +0 -6
- package/src/agents/tools/execCommand.ts +0 -162
- package/src/agents/tools/fileSearch.ts +0 -35
- package/src/agents/tools/finalAnswer.ts +0 -4
- package/src/agents/tools/googleSearch.ts +0 -243
- package/src/agents/tools/index.ts +0 -33
- package/src/agents/tools/language/definitions.ts +0 -105
- package/src/agents/tools/language/index.ts +0 -20
- package/src/agents/tools/lazy/definitions.ts +0 -72
- package/src/agents/tools/lazy/disableTools.ts +0 -16
- package/src/agents/tools/lazy/enableTools.ts +0 -16
- package/src/agents/tools/lazy/index.ts +0 -3
- package/src/agents/tools/lazy/listAvailableTools.ts +0 -17
- package/src/agents/tools/lintFile.ts +0 -19
- package/src/agents/tools/list.ts +0 -739
- package/src/agents/tools/loadImageAsBase64.ts +0 -83
- package/src/agents/tools/loadWebpage.ts +0 -19
- package/src/agents/tools/mcp/connectMcpServer.ts +0 -40
- package/src/agents/tools/mcp/definitions.ts +0 -67
- package/src/agents/tools/mcp/disconnectMcpServer.ts +0 -40
- package/src/agents/tools/mcp/index.ts +0 -3
- package/src/agents/tools/mcp/listAvailableMcpServers.ts +0 -28
- package/src/agents/tools/minimal/callTool.ts +0 -45
- package/src/agents/tools/minimal/definitions.ts +0 -50
- package/src/agents/tools/minimal/index.ts +0 -3
- package/src/agents/tools/minimal/inspectTools.ts +0 -27
- package/src/agents/tools/modifyFile.ts +0 -53
- package/src/agents/tools/observe.ts +0 -247
- package/src/agents/tools/patch.ts +0 -1287
- package/src/agents/tools/readBlocks.ts +0 -83
- package/src/agents/tools/readFile.ts +0 -105
- package/src/agents/tools/replyToParent.ts +0 -123
- package/src/agents/tools/runGenerate.ts +0 -210
- package/src/agents/tools/scanFile.ts +0 -16
- package/src/agents/tools/sendAgentMessage.ts +0 -139
- package/src/agents/tools/skills.ts +0 -79
- package/src/agents/tools/startAgentTask.ts +0 -393
- package/src/agents/tools/stringReplace.ts +0 -105
- package/src/agents/tools/textSearch.ts +0 -128
- package/src/agents/tools/types/fileblock.ts +0 -5
- package/src/agents/tools/visionTool.ts +0 -35
- package/src/agents/tools/waitForAgentCompleted.ts +0 -270
- package/src/agents/tools/writeFile.ts +0 -106
- package/src/agents/tools/ycmd/client.ts +0 -608
- package/src/agents/tools/ycmd/definitions.ts +0 -294
- package/src/agents/tools/ycmd/detection.ts +0 -211
- package/src/agents/tools/ycmd/index.ts +0 -11
- package/src/agents/tools/ycmd/installer.ts +0 -251
- package/src/agents/tools/ycmd/server.ts +0 -545
- package/src/agents/tools/ycmd/serverManager.ts +0 -316
- package/src/agents/tools/ycmd/tools/completion.ts +0 -113
- package/src/agents/tools/ycmd/tools/diagnostics.ts +0 -166
- package/src/agents/tools/ycmd/tools/getLocations.ts +0 -173
- package/src/agents/tools/ycmd/tools/goto.ts +0 -169
- package/src/agents/tools/ycmd/tools/refactor.ts +0 -204
- package/src/agents/tools/ycmd/tools/signature.ts +0 -174
- package/src/agents/tools/ycmd/tools/start.ts +0 -95
- package/src/agents/tools/ycmd/utils/pathUtils.ts +0 -59
- package/src/ai.ts +0 -306
- package/src/auth/browserLogin.ts +0 -406
- package/src/auth/environmentAuth.ts +0 -51
- package/src/auth/errors.ts +0 -6
- package/src/auth/jwtStore.ts +0 -70
- package/src/auth/keyAuth.ts +0 -142
- package/src/auth/keyManager.ts +0 -331
- package/src/auth/registerIdentity.ts +0 -67
- package/src/auth/spinner.ts +0 -23
- package/src/chat/CliChatService.ts +0 -438
- package/src/chat/modules/AgentModule.ts +0 -1664
- package/src/chat/modules/AskModule.ts +0 -98
- package/src/chat/modules/BaseChatModule.ts +0 -65
- package/src/chat/modules/ClipboardImageModule.ts +0 -136
- package/src/chat/modules/CustomCommandsModule.ts +0 -80
- package/src/chat/modules/InternalChatModule.ts +0 -216
- package/src/chat/modules/RemoteSyncModule.ts +0 -482
- package/src/chat/modules/RendererModule.ts +0 -139
- package/src/chat/modules/SearchModule.ts +0 -168
- package/src/chat/modules/SessionsModule.ts +0 -969
- package/src/chat/modules/SetupModule.ts +0 -185
- package/src/chat/modules/ShellCommandModule.ts +0 -98
- package/src/chat/modules/SystemModule.ts +0 -161
- package/src/chat/modules/ToolCommandModule.ts +0 -102
- package/src/chat/modules/VoiceModule.ts +0 -70
- package/src/chat/modules/index.ts +0 -8
- package/src/chat/renderer/CompactRenderer.ts +0 -229
- package/src/chat/renderer/ConsoleRenderer.ts +0 -160
- package/src/chat/renderer/FancyRenderer.ts +0 -440
- package/src/chat/renderer/PlainRenderer.ts +0 -218
- package/src/chat/renderer/index.ts +0 -6
- package/src/chat/renderer/loadRenderer.ts +0 -316
- package/src/chat/renderer/messagesToRenderEvents.ts +0 -96
- package/src/chat/renderer/types.ts +0 -99
- package/src/chat/types.ts +0 -146
- package/src/chat.ts +0 -140
- package/src/cli.ts +0 -180
- package/src/clients/anthropic.ts +0 -772
- package/src/clients/attribution.ts +0 -53
- package/src/clients/cerebras.ts +0 -10
- package/src/clients/contextLimits.ts +0 -263
- package/src/clients/copilot.ts +0 -23
- package/src/clients/deepseek.ts +0 -16
- package/src/clients/fireworks.ts +0 -71
- package/src/clients/gemini.ts +0 -1169
- package/src/clients/github.ts +0 -16
- package/src/clients/groq.ts +0 -15
- package/src/clients/http.ts +0 -719
- package/src/clients/index.ts +0 -1153
- package/src/clients/knowhow.ts +0 -130
- package/src/clients/knowhowMcp.ts +0 -118
- package/src/clients/llama.ts +0 -16
- package/src/clients/meta.ts +0 -27
- package/src/clients/mistral.ts +0 -16
- package/src/clients/nvidia.ts +0 -16
- package/src/clients/openai.ts +0 -1186
- package/src/clients/openrouter.ts +0 -24
- package/src/clients/pricing/anthropic.ts +0 -149
- package/src/clients/pricing/cerebras.ts +0 -11
- package/src/clients/pricing/copilot.ts +0 -60
- package/src/clients/pricing/deepseek.ts +0 -15
- package/src/clients/pricing/fireworks.ts +0 -182
- package/src/clients/pricing/github.ts +0 -69
- package/src/clients/pricing/google.ts +0 -385
- package/src/clients/pricing/groq.ts +0 -56
- package/src/clients/pricing/index.ts +0 -44
- package/src/clients/pricing/llama.ts +0 -18
- package/src/clients/pricing/meta.ts +0 -12
- package/src/clients/pricing/mistral.ts +0 -34
- package/src/clients/pricing/models.ts +0 -25
- package/src/clients/pricing/nvidia.ts +0 -102
- package/src/clients/pricing/openai.ts +0 -409
- package/src/clients/pricing/openrouter.ts +0 -36
- package/src/clients/pricing/qwen.ts +0 -80
- package/src/clients/pricing/types.ts +0 -125
- package/src/clients/pricing/xai.ts +0 -137
- package/src/clients/qwen.ts +0 -16
- package/src/clients/responseMetadata.ts +0 -221
- package/src/clients/types.ts +0 -531
- package/src/clients/withRetry.ts +0 -89
- package/src/clients/xai.ts +0 -693
- package/src/cloudWorker.ts +0 -394
- package/src/commands/agent.ts +0 -342
- package/src/commands/agents.ts +0 -1037
- package/src/commands/behaviors.ts +0 -47
- package/src/commands/convert.ts +0 -291
- package/src/commands/hash.ts +0 -179
- package/src/commands/mcp.ts +0 -743
- package/src/commands/misc.ts +0 -373
- package/src/commands/modules.ts +0 -704
- package/src/commands/processes.ts +0 -248
- package/src/commands/remote.ts +0 -77
- package/src/commands/replay.ts +0 -503
- package/src/commands/sandbox.ts +0 -566
- package/src/commands/services.ts +0 -168
- package/src/commands/skills.ts +0 -107
- package/src/commands/workers.ts +0 -168
- package/src/config.ts +0 -468
- package/src/conversion.ts +0 -69
- package/src/dataset/diffs/README.md +0 -12
- package/src/dataset/diffs/debug-errors.ts +0 -29
- package/src/dataset/diffs/debug.ts +0 -64
- package/src/dataset/diffs/generate.ts +0 -71
- package/src/dataset/diffs/jsonl.ts +0 -53
- package/src/dataset/diffs/test.ts +0 -194
- package/src/embeddings.ts +0 -494
- package/src/fileSync.ts +0 -369
- package/src/generate.ts +0 -529
- package/src/hashes.ts +0 -180
- package/src/index.ts +0 -261
- package/src/logger.ts +0 -197
- package/src/login.ts +0 -209
- package/src/microphone.ts +0 -141
- package/src/migrations.ts +0 -151
- package/src/plugins/AgentsMdPlugin.ts +0 -118
- package/src/plugins/GitPlugin.ts +0 -598
- package/src/plugins/LinterPlugin.ts +0 -214
- package/src/plugins/PluginBase.ts +0 -70
- package/src/plugins/SkillsPlugin.ts +0 -37
- package/src/plugins/embedding.ts +0 -82
- package/src/plugins/exec.ts +0 -70
- package/src/plugins/language.ts +0 -290
- package/src/plugins/plugins.ts +0 -175
- package/src/plugins/tmux.ts +0 -132
- package/src/plugins/types.ts +0 -36
- package/src/plugins/url.ts +0 -101
- package/src/plugins/vim.ts +0 -89
- package/src/processes/ProcessManager.ts +0 -96
- package/src/processes/managedProcessShim.ts +0 -138
- package/src/processors/Base64ImageDetector.ts +0 -502
- package/src/processors/CustomVariables.ts +0 -693
- package/src/processors/GemmaToolProcessor.ts +0 -163
- package/src/processors/HarmonyToolProcessor.ts +0 -264
- package/src/processors/JsonCompressor.ts +0 -510
- package/src/processors/MinimalToolsMessageProcessor.ts +0 -113
- package/src/processors/TokenCompressor.ts +0 -620
- package/src/processors/ToolResponseCache.ts +0 -322
- package/src/processors/XmlToolCallProcessor.ts +0 -533
- package/src/processors/index.ts +0 -14
- package/src/processors/tools/boundedToolResponse.ts +0 -49
- package/src/processors/tools/grepToolResponse.ts +0 -230
- package/src/processors/tools/index.ts +0 -23
- package/src/processors/tools/jqToolResponse.ts +0 -159
- package/src/processors/tools/listStoredToolResponses.ts +0 -124
- package/src/processors/tools/tailToolResponse.ts +0 -148
- package/src/prompts/BasicCodeDocumenter.ts +0 -1
- package/src/prompts/BasicProjectDocumenter.ts +0 -1
- package/src/prompts/EmbeddingSeachHelper.ts +0 -1
- package/src/prompts/KnowhowConfigExamples.ts +0 -376
- package/src/prompts/index.ts +0 -9
- package/src/remotes.ts +0 -110
- package/src/server/index.ts +0 -16
- package/src/services/AgentService.ts +0 -134
- package/src/services/AgentSyncFs.ts +0 -775
- package/src/services/AgentSyncKnowhowWeb.ts +0 -389
- package/src/services/BehaviorsService.ts +0 -466
- package/src/services/DockerService.ts +0 -511
- package/src/services/EmbeddingService.ts +0 -427
- package/src/services/EmbeddingsService.ts +0 -73
- package/src/services/EventService.ts +0 -279
- package/src/services/ExtensionsService.ts +0 -25
- package/src/services/KnowhowClient.ts +0 -928
- package/src/services/LazyToolsService.ts +0 -210
- package/src/services/Mcp.ts +0 -727
- package/src/services/McpServer.ts +0 -155
- package/src/services/McpWebsocketTransport.ts +0 -87
- package/src/services/MediaProcessorService.ts +0 -669
- package/src/services/MessageProcessor.ts +0 -114
- package/src/services/MinimalToolsService.ts +0 -177
- package/src/services/RuntimeReloadService.ts +0 -31
- package/src/services/S3.ts +0 -61
- package/src/services/SessionManager.ts +0 -358
- package/src/services/SkillsService.ts +0 -822
- package/src/services/SyncedAgentWatcher.ts +0 -124
- package/src/services/SyncerService.ts +0 -191
- package/src/services/TaskRegistry.ts +0 -110
- package/src/services/Tools.ts +0 -580
- package/src/services/TracingService.ts +0 -116
- package/src/services/conversion/ConversionService.ts +0 -757
- package/src/services/conversion/index.ts +0 -2
- package/src/services/conversion/types.ts +0 -87
- package/src/services/flags.ts +0 -51
- package/src/services/index.ts +0 -117
- package/src/services/modules/computerUse.ts +0 -218
- package/src/services/modules/index.ts +0 -314
- package/src/services/modules/types.ts +0 -109
- package/src/services/types.ts +0 -60
- package/src/services/watchers/FsSyncer.ts +0 -199
- package/src/services/watchers/RemoteSyncer.ts +0 -196
- package/src/services/watchers/index.ts +0 -2
- package/src/tunnel.ts +0 -243
- package/src/types.ts +0 -282
- package/src/util/Trace.ts +0 -236
- package/src/utils/InputQueueManager.ts +0 -493
- package/src/utils/errors.ts +0 -0
- package/src/utils/http.ts +0 -150
- package/src/utils/index.ts +0 -111
- package/src/worker.ts +0 -696
- package/src/workerRegistry.ts +0 -152
- package/src/workers/auth/PasskeySetup.ts +0 -181
- package/src/workers/auth/WorkerPasskeyAuth.ts +0 -190
- package/src/workers/auth/WsMiddleware.ts +0 -99
- package/src/workers/auth/authMiddleware.ts +0 -104
- package/src/workers/auth/types.ts +0 -70
- package/src/workers/tools/getChallenge.ts +0 -33
- package/src/workers/tools/index.ts +0 -20
- package/src/workers/tools/listAllowedPorts.ts +0 -30
- package/src/workers/tools/lock.ts +0 -31
- package/src/workers/tools/reloadConfig.ts +0 -84
- package/src/workers/tools/unlock.ts +0 -116
- package/tests/XmlToolCallProcessor.test.ts +0 -468
- package/tests/agents/interrupt.test.ts +0 -200
- package/tests/agents/observe-base.test.ts +0 -183
- package/tests/agents/tools/connectAgent.test.ts +0 -138
- package/tests/agents/tools/observe.test.ts +0 -179
- package/tests/agents/tools/readFile.test.ts +0 -88
- package/tests/agents/tools/replyToParent.test.ts +0 -125
- package/tests/agents/tools/sendAgentMessage.test.ts +0 -99
- package/tests/agents/tools/waitForAgentCompleted.test.ts +0 -147
- package/tests/chat/detach-attach-rendering.test.ts +0 -315
- package/tests/clients/AIClient.test.ts +0 -668
- package/tests/clients/anthropic.test.ts +0 -202
- package/tests/clients/contextLimits.test.ts +0 -97
- package/tests/clients/fireworks.test.ts +0 -65
- package/tests/clients/openai.images.test.ts +0 -105
- package/tests/clients/pricing.test.ts +0 -206
- package/tests/clients/reasoningEffort.test.ts +0 -140
- package/tests/compressor/bigstring.test.ts +0 -450
- package/tests/compressor/bigstring.txt +0 -1
- package/tests/compressor/githubjson.txt +0 -1
- package/tests/compressor/toolResponseCache.test.ts +0 -304
- package/tests/compressor/usageBase64.json +0 -159
- package/tests/compressor/usageBase64.test.ts +0 -175
- package/tests/fixtures/fake-secret.txt +0 -1
- package/tests/manual/agent-events/run-test.ts +0 -203
- package/tests/manual/browser-login/README.md +0 -189
- package/tests/manual/browser-login/test_browser_login_basic.ts +0 -115
- package/tests/manual/browser-login/test_cli_integration.ts +0 -169
- package/tests/manual/browser-login/test_cross_platform_browser.ts +0 -186
- package/tests/manual/browser-login/test_error_scenarios.ts +0 -223
- package/tests/manual/cli/no-env.sh +0 -274
- package/tests/manual/clients/completions.json +0 -1151
- package/tests/manual/clients/completions.test.ts +0 -198
- package/tests/manual/file-edits/figma.test.ts +0 -3
- package/tests/manual/file-edits/fileblocks/readwrite.test.ts +0 -100
- package/tests/manual/file-edits/patching/input.txt +0 -145
- package/tests/manual/file-edits/patching/output.txt +0 -145
- package/tests/manual/file-edits/patching/patch.txt +0 -15
- package/tests/manual/file-edits/patching/unseen.txt +0 -80
- package/tests/manual/file-edits/patching.test.ts +0 -139
- package/tests/manual/modalities/README.md +0 -157
- package/tests/manual/modalities/google.modalities.test.ts +0 -335
- package/tests/manual/modalities/openai.modalities.test.ts +0 -329
- package/tests/manual/modalities/streaming.test.ts +0 -260
- package/tests/manual/modalities/xai.modalities.test.ts +0 -294
- package/tests/manual/test-concurrent-ask.ts +0 -43
- package/tests/manual/ycmd/debug_diagnostics_test.ts +0 -127
- package/tests/manual/ycmd/fixtures/debug_diagnostics.ts +0 -26
- package/tests/manual/ycmd/fixtures/file_change_test.ts +0 -17
- package/tests/manual/ycmd/minimal_advanced_test.ts +0 -108
- package/tests/manual/ycmd/simple_diagnostics_test.ts +0 -61
- package/tests/manual/ycmd/simple_test.ts +0 -74
- package/tests/manual/ycmd/test-typescript-sample.ts +0 -34
- package/tests/manual/ycmd/test_advanced_features.ts +0 -407
- package/tests/manual/ycmd/test_advanced_with_tools.ts +0 -320
- package/tests/manual/ycmd/test_comprehensive_typescript.ts +0 -179
- package/tests/manual/ycmd/test_diagnostics_file_changes.ts +0 -249
- package/tests/manual/ycmd/test_diagnostics_fix.ts +0 -99
- package/tests/manual/ycmd/test_diagnostics_simple.ts +0 -100
- package/tests/manual/ycmd/test_diagnostics_timing.ts +0 -120
- package/tests/manual/ycmd/test_discover_commands.ts +0 -310
- package/tests/manual/ycmd/test_endpoints.ts +0 -115
- package/tests/manual/ycmd/test_final_comprehensive.ts +0 -218
- package/tests/manual/ycmd/test_final_validation.ts +0 -150
- package/tests/manual/ycmd/test_implementation.js +0 -42
- package/tests/manual/ycmd/test_individual_ycmd_tool.ts +0 -39
- package/tests/manual/ycmd/test_server_manager.ts +0 -52
- package/tests/manual/ycmd/test_simple_debug.ts +0 -86
- package/tests/manual/ycmd/test_tsserver_workflow.js +0 -83
- package/tests/manual/ycmd/test_tsserver_workflow.ts +0 -122
- package/tests/manual/ycmd/test_typescript_simple.ts +0 -48
- package/tests/manual/ycmd/test_typescript_ycmd.ts +0 -105
- package/tests/manual/ycmd/test_workspace_config.ts +0 -90
- package/tests/manual/ycmd/test_ycmd_auto_start.ts +0 -137
- package/tests/manual/ycmd/test_ycmd_comprehensive.ts +0 -73
- package/tests/manual/ycmd/test_ycmd_connection.py +0 -10
- package/tests/manual/ycmd/test_ycmd_direct.ts +0 -142
- package/tests/manual/ycmd/test_ycmd_experiment.ts +0 -48
- package/tests/manual/ycmd/test_ycmd_final.ts +0 -200
- package/tests/manual/ycmd/test_ycmd_fixed.py +0 -18
- package/tests/manual/ycmd/test_ycmd_integration.ts +0 -112
- package/tests/manual/ycmd/test_ycmd_simple.ts +0 -45
- package/tests/manual/ycmd/test_ycmd_usage.py +0 -27
- package/tests/manual/ycmd/working_simple_test.ts +0 -134
- package/tests/patching/corrupted.test.ts +0 -78
- package/tests/patching/fixtures/transcript-mangles/agent-sync-fs-nested-catch.json +0 -9
- package/tests/patching/fixtures/transcript-mangles/automation-functions-crossed.json +0 -9
- package/tests/patching/fixtures/transcript-mangles/fruit-ninja-confirmed-retirement.json +0 -8
- package/tests/patching/imports.patch.txt +0 -11
- package/tests/patching/imports.test.ts +0 -43
- package/tests/patching/imports.txt +0 -11
- package/tests/patching/interface.patch.txt +0 -15
- package/tests/patching/interface.txt +0 -7
- package/tests/patching/patchFileOutput.test.ts +0 -328
- package/tests/patching/regression-2026.test.ts +0 -752
- package/tests/patching/transcriptMangleRegression.test.ts +0 -125
- package/tests/plugins/language/languagePlugin-content-triggers.test.ts +0 -346
- package/tests/plugins/language/languagePlugin-integration.test.ts +0 -471
- package/tests/plugins/language/languagePlugin.test.ts +0 -385
- package/tests/processes/managedProcessShim.test.ts +0 -59
- package/tests/processors/Base64ImageDetector.test.ts +0 -979
- package/tests/processors/CustomVariables.test.ts +0 -981
- package/tests/processors/CustomVariablesBenchmark.test.ts +0 -237
- package/tests/processors/HarmonyToolProcessor.test.ts +0 -490
- package/tests/processors/TokenCompressor.test.ts +0 -674
- package/tests/processors/ToolResponseCache.test.ts +0 -864
- package/tests/processors/tools/boundedRetrievalTools.test.ts +0 -68
- package/tests/processors/tools/grepToolResponse.test.ts +0 -159
- package/tests/services/ConversionService.test.ts +0 -154
- package/tests/services/DockerService.test.ts +0 -24
- package/tests/services/Tools.test.ts +0 -1738
- package/tests/services/ToolsService.setFunction.test.ts +0 -68
- package/tests/services/WorkerReloadConfig.test.ts +0 -141
- package/tests/test.spec.ts +0 -163
- package/tests/unit/InputQueueManager.test.ts +0 -174
- package/tests/unit/McpWebsocketTransport.test.ts +0 -56
- package/tests/unit/agents/historyRollback.test.ts +0 -53
- package/tests/unit/agents/tools/loadImageAsBase64.test.ts +0 -44
- package/tests/unit/auth/jwtStore.test.ts +0 -55
- package/tests/unit/auth/keyAuth.test.ts +0 -152
- package/tests/unit/auth/keyManager.test.ts +0 -130
- package/tests/unit/auth/registerIdentity.test.ts +0 -99
- package/tests/unit/chat/ToolCommandModule.test.ts +0 -71
- package/tests/unit/chat/historyCommandArgs.test.ts +0 -37
- package/tests/unit/clients/AIClient.test.ts +0 -454
- package/tests/unit/clients/anthropic.responseMetadata.test.ts +0 -81
- package/tests/unit/clients/attribution.test.ts +0 -185
- package/tests/unit/clients/http.responseMetadata.test.ts +0 -86
- package/tests/unit/clients/openai.responseMetadata.test.ts +0 -90
- package/tests/unit/clients/responseMetadata.test.ts +0 -123
- package/tests/unit/clients/withRetry.test.ts +0 -319
- package/tests/unit/commands/agents.test.ts +0 -111
- package/tests/unit/commands/github-credentials.test.ts +0 -210
- package/tests/unit/commands/misc.test.ts +0 -85
- package/tests/unit/commands/remote.test.ts +0 -79
- package/tests/unit/commands/sandbox.test.ts +0 -350
- package/tests/unit/hashes.test.ts +0 -23
- package/tests/unit/input-queue.test.ts +0 -80
- package/tests/unit/login.test.ts +0 -218
- package/tests/unit/modules/moduleLoading.test.ts +0 -305
- package/tests/unit/plugins/pluginLoading.test.ts +0 -97
- package/tests/unit/services/AgentSyncKnowhowWeb.test.ts +0 -38
- package/tests/unit/services/KnowhowClient.test.ts +0 -84
- package/tests/unit/services/LazyToolsService.test.ts +0 -53
- package/tests/unit/services/Mcp.test.ts +0 -56
- package/tests/unit/services/MinimalToolsService.test.ts +0 -424
- package/tests/unit/services/RuntimeReloadService.test.ts +0 -29
- package/tests/unit/services/SessionManager.test.ts +0 -43
- package/tests/unit/services/SyncedAgentWatcher.test.ts +0 -89
- package/tests/unit/services/SyncerService.test.ts +0 -45
- package/tests/unit/tunnel.test.ts +0 -51
- package/tests/unit/util/Trace.test.ts +0 -119
- package/tests/unit/utils/http.test.ts +0 -43
- package/ts_build/tests/XmlToolCallProcessor.test.d.ts +0 -1
- package/ts_build/tests/XmlToolCallProcessor.test.js +0 -376
- package/ts_build/tests/XmlToolCallProcessor.test.js.map +0 -1
- package/ts_build/tests/agents/interrupt.test.d.ts +0 -14
- package/ts_build/tests/agents/interrupt.test.js +0 -136
- package/ts_build/tests/agents/interrupt.test.js.map +0 -1
- package/ts_build/tests/agents/observe-base.test.d.ts +0 -1
- package/ts_build/tests/agents/observe-base.test.js +0 -149
- package/ts_build/tests/agents/observe-base.test.js.map +0 -1
- package/ts_build/tests/agents/tools/connectAgent.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/connectAgent.test.js +0 -142
- package/ts_build/tests/agents/tools/connectAgent.test.js.map +0 -1
- package/ts_build/tests/agents/tools/observe.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/observe.test.js +0 -148
- package/ts_build/tests/agents/tools/observe.test.js.map +0 -1
- package/ts_build/tests/agents/tools/readFile.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/readFile.test.js +0 -90
- package/ts_build/tests/agents/tools/readFile.test.js.map +0 -1
- package/ts_build/tests/agents/tools/replyToParent.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/replyToParent.test.js +0 -116
- package/ts_build/tests/agents/tools/replyToParent.test.js.map +0 -1
- package/ts_build/tests/agents/tools/sendAgentMessage.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/sendAgentMessage.test.js +0 -112
- package/ts_build/tests/agents/tools/sendAgentMessage.test.js.map +0 -1
- package/ts_build/tests/agents/tools/waitForAgentCompleted.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/waitForAgentCompleted.test.js +0 -147
- package/ts_build/tests/agents/tools/waitForAgentCompleted.test.js.map +0 -1
- package/ts_build/tests/chat/detach-attach-rendering.test.d.ts +0 -1
- package/ts_build/tests/chat/detach-attach-rendering.test.js +0 -168
- package/ts_build/tests/chat/detach-attach-rendering.test.js.map +0 -1
- package/ts_build/tests/clients/AIClient.test.d.ts +0 -1
- package/ts_build/tests/clients/AIClient.test.js +0 -483
- package/ts_build/tests/clients/AIClient.test.js.map +0 -1
- package/ts_build/tests/clients/anthropic.test.d.ts +0 -1
- package/ts_build/tests/clients/anthropic.test.js +0 -159
- package/ts_build/tests/clients/anthropic.test.js.map +0 -1
- package/ts_build/tests/clients/contextLimits.test.d.ts +0 -1
- package/ts_build/tests/clients/contextLimits.test.js +0 -69
- package/ts_build/tests/clients/contextLimits.test.js.map +0 -1
- package/ts_build/tests/clients/fireworks.test.d.ts +0 -1
- package/ts_build/tests/clients/fireworks.test.js +0 -65
- package/ts_build/tests/clients/fireworks.test.js.map +0 -1
- package/ts_build/tests/clients/openai.images.test.d.ts +0 -1
- package/ts_build/tests/clients/openai.images.test.js +0 -94
- package/ts_build/tests/clients/openai.images.test.js.map +0 -1
- package/ts_build/tests/clients/pricing.test.d.ts +0 -1
- package/ts_build/tests/clients/pricing.test.js +0 -124
- package/ts_build/tests/clients/pricing.test.js.map +0 -1
- package/ts_build/tests/clients/reasoningEffort.test.d.ts +0 -1
- package/ts_build/tests/clients/reasoningEffort.test.js +0 -116
- package/ts_build/tests/clients/reasoningEffort.test.js.map +0 -1
- package/ts_build/tests/compressor/bigstring.test.d.ts +0 -1
- package/ts_build/tests/compressor/bigstring.test.js +0 -275
- package/ts_build/tests/compressor/bigstring.test.js.map +0 -1
- package/ts_build/tests/compressor/toolResponseCache.test.d.ts +0 -1
- package/ts_build/tests/compressor/toolResponseCache.test.js +0 -250
- package/ts_build/tests/compressor/toolResponseCache.test.js.map +0 -1
- package/ts_build/tests/compressor/usageBase64.test.d.ts +0 -1
- package/ts_build/tests/compressor/usageBase64.test.js +0 -109
- package/ts_build/tests/compressor/usageBase64.test.js.map +0 -1
- package/ts_build/tests/manual/agent-events/run-test.d.ts +0 -2
- package/ts_build/tests/manual/agent-events/run-test.js +0 -148
- package/ts_build/tests/manual/agent-events/run-test.js.map +0 -1
- package/ts_build/tests/manual/browser-login/test_browser_login_basic.d.ts +0 -2
- package/ts_build/tests/manual/browser-login/test_browser_login_basic.js +0 -118
- package/ts_build/tests/manual/browser-login/test_browser_login_basic.js.map +0 -1
- package/ts_build/tests/manual/browser-login/test_cli_integration.d.ts +0 -2
- package/ts_build/tests/manual/browser-login/test_cli_integration.js +0 -163
- package/ts_build/tests/manual/browser-login/test_cli_integration.js.map +0 -1
- package/ts_build/tests/manual/browser-login/test_cross_platform_browser.d.ts +0 -2
- package/ts_build/tests/manual/browser-login/test_cross_platform_browser.js +0 -169
- package/ts_build/tests/manual/browser-login/test_cross_platform_browser.js.map +0 -1
- package/ts_build/tests/manual/browser-login/test_error_scenarios.d.ts +0 -2
- package/ts_build/tests/manual/browser-login/test_error_scenarios.js +0 -207
- package/ts_build/tests/manual/browser-login/test_error_scenarios.js.map +0 -1
- package/ts_build/tests/manual/clients/completions.test.d.ts +0 -1
- package/ts_build/tests/manual/clients/completions.test.js +0 -151
- package/ts_build/tests/manual/clients/completions.test.js.map +0 -1
- package/ts_build/tests/manual/file-edits/figma.test.d.ts +0 -0
- package/ts_build/tests/manual/file-edits/figma.test.js +0 -2
- package/ts_build/tests/manual/file-edits/figma.test.js.map +0 -1
- package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.d.ts +0 -1
- package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js +0 -110
- package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js.map +0 -1
- package/ts_build/tests/manual/file-edits/patching.test.d.ts +0 -1
- package/ts_build/tests/manual/file-edits/patching.test.js +0 -129
- package/ts_build/tests/manual/file-edits/patching.test.js.map +0 -1
- package/ts_build/tests/manual/modalities/google.modalities.test.d.ts +0 -1
- package/ts_build/tests/manual/modalities/google.modalities.test.js +0 -262
- package/ts_build/tests/manual/modalities/google.modalities.test.js.map +0 -1
- package/ts_build/tests/manual/modalities/openai.modalities.test.d.ts +0 -1
- package/ts_build/tests/manual/modalities/openai.modalities.test.js +0 -262
- package/ts_build/tests/manual/modalities/openai.modalities.test.js.map +0 -1
- package/ts_build/tests/manual/modalities/streaming.test.d.ts +0 -1
- package/ts_build/tests/manual/modalities/streaming.test.js +0 -216
- package/ts_build/tests/manual/modalities/streaming.test.js.map +0 -1
- package/ts_build/tests/manual/modalities/xai.modalities.test.d.ts +0 -1
- package/ts_build/tests/manual/modalities/xai.modalities.test.js +0 -219
- package/ts_build/tests/manual/modalities/xai.modalities.test.js.map +0 -1
- package/ts_build/tests/manual/test-concurrent-ask.d.ts +0 -1
- package/ts_build/tests/manual/test-concurrent-ask.js +0 -22
- package/ts_build/tests/manual/test-concurrent-ask.js.map +0 -1
- package/ts_build/tests/manual/ycmd/debug_diagnostics_test.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js +0 -124
- package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js.map +0 -1
- package/ts_build/tests/manual/ycmd/minimal_advanced_test.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/minimal_advanced_test.js +0 -114
- package/ts_build/tests/manual/ycmd/minimal_advanced_test.js.map +0 -1
- package/ts_build/tests/manual/ycmd/simple_diagnostics_test.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js +0 -84
- package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js.map +0 -1
- package/ts_build/tests/manual/ycmd/simple_test.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/simple_test.js +0 -92
- package/ts_build/tests/manual/ycmd/simple_test.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test-typescript-sample.d.ts +0 -14
- package/ts_build/tests/manual/ycmd/test-typescript-sample.js +0 -20
- package/ts_build/tests/manual/ycmd/test-typescript-sample.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_advanced_features.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_advanced_features.js +0 -306
- package/ts_build/tests/manual/ycmd/test_advanced_features.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_advanced_with_tools.d.ts +0 -3
- package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js +0 -271
- package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js +0 -196
- package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js +0 -184
- package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_fix.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js +0 -116
- package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_simple.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js +0 -114
- package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_timing.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js +0 -129
- package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_discover_commands.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_discover_commands.js +0 -252
- package/ts_build/tests/manual/ycmd/test_discover_commands.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_endpoints.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_endpoints.js +0 -130
- package/ts_build/tests/manual/ycmd/test_endpoints.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_final_comprehensive.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_final_comprehensive.js +0 -231
- package/ts_build/tests/manual/ycmd/test_final_comprehensive.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_final_validation.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_final_validation.js +0 -170
- package/ts_build/tests/manual/ycmd/test_final_validation.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js +0 -37
- package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_server_manager.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_server_manager.js +0 -38
- package/ts_build/tests/manual/ycmd/test_server_manager.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_simple_debug.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_simple_debug.js +0 -109
- package/ts_build/tests/manual/ycmd/test_simple_debug.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_tsserver_workflow.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js +0 -138
- package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_typescript_simple.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_typescript_simple.js +0 -76
- package/ts_build/tests/manual/ycmd/test_typescript_simple.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_typescript_ycmd.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js +0 -115
- package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_workspace_config.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_workspace_config.js +0 -99
- package/ts_build/tests/manual/ycmd/test_workspace_config.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js +0 -140
- package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js +0 -93
- package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_direct.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_ycmd_direct.js +0 -159
- package/ts_build/tests/manual/ycmd/test_ycmd_direct.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_experiment.d.ts +0 -15
- package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js +0 -68
- package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_final.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_ycmd_final.js +0 -205
- package/ts_build/tests/manual/ycmd/test_ycmd_final.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_integration.d.ts +0 -3
- package/ts_build/tests/manual/ycmd/test_ycmd_integration.js +0 -119
- package/ts_build/tests/manual/ycmd/test_ycmd_integration.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_simple.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_ycmd_simple.js +0 -36
- package/ts_build/tests/manual/ycmd/test_ycmd_simple.js.map +0 -1
- package/ts_build/tests/manual/ycmd/working_simple_test.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/working_simple_test.js +0 -144
- package/ts_build/tests/manual/ycmd/working_simple_test.js.map +0 -1
- package/ts_build/tests/patching/corrupted.test.d.ts +0 -1
- package/ts_build/tests/patching/corrupted.test.js +0 -53
- package/ts_build/tests/patching/corrupted.test.js.map +0 -1
- package/ts_build/tests/patching/imports.test.d.ts +0 -1
- package/ts_build/tests/patching/imports.test.js +0 -71
- package/ts_build/tests/patching/imports.test.js.map +0 -1
- package/ts_build/tests/patching/patchFileOutput.test.d.ts +0 -1
- package/ts_build/tests/patching/patchFileOutput.test.js +0 -269
- package/ts_build/tests/patching/patchFileOutput.test.js.map +0 -1
- package/ts_build/tests/patching/regression-2026.test.d.ts +0 -1
- package/ts_build/tests/patching/regression-2026.test.js +0 -528
- package/ts_build/tests/patching/regression-2026.test.js.map +0 -1
- package/ts_build/tests/patching/transcriptMangleRegression.test.d.ts +0 -1
- package/ts_build/tests/patching/transcriptMangleRegression.test.js +0 -104
- package/ts_build/tests/patching/transcriptMangleRegression.test.js.map +0 -1
- package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.d.ts +0 -1
- package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +0 -294
- package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +0 -1
- package/ts_build/tests/plugins/language/languagePlugin-integration.test.d.ts +0 -1
- package/ts_build/tests/plugins/language/languagePlugin-integration.test.js +0 -343
- package/ts_build/tests/plugins/language/languagePlugin-integration.test.js.map +0 -1
- package/ts_build/tests/plugins/language/languagePlugin.test.d.ts +0 -1
- package/ts_build/tests/plugins/language/languagePlugin.test.js +0 -315
- package/ts_build/tests/plugins/language/languagePlugin.test.js.map +0 -1
- package/ts_build/tests/processes/managedProcessShim.test.d.ts +0 -1
- package/ts_build/tests/processes/managedProcessShim.test.js +0 -92
- package/ts_build/tests/processes/managedProcessShim.test.js.map +0 -1
- package/ts_build/tests/processors/Base64ImageDetector.test.d.ts +0 -1
- package/ts_build/tests/processors/Base64ImageDetector.test.js +0 -792
- package/ts_build/tests/processors/Base64ImageDetector.test.js.map +0 -1
- package/ts_build/tests/processors/CustomVariables.test.d.ts +0 -1
- package/ts_build/tests/processors/CustomVariables.test.js +0 -764
- package/ts_build/tests/processors/CustomVariables.test.js.map +0 -1
- package/ts_build/tests/processors/CustomVariablesBenchmark.test.d.ts +0 -1
- package/ts_build/tests/processors/CustomVariablesBenchmark.test.js +0 -179
- package/ts_build/tests/processors/CustomVariablesBenchmark.test.js.map +0 -1
- package/ts_build/tests/processors/HarmonyToolProcessor.test.d.ts +0 -1
- package/ts_build/tests/processors/HarmonyToolProcessor.test.js +0 -382
- package/ts_build/tests/processors/HarmonyToolProcessor.test.js.map +0 -1
- package/ts_build/tests/processors/TokenCompressor.test.d.ts +0 -1
- package/ts_build/tests/processors/TokenCompressor.test.js +0 -473
- package/ts_build/tests/processors/TokenCompressor.test.js.map +0 -1
- package/ts_build/tests/processors/ToolResponseCache.test.d.ts +0 -1
- package/ts_build/tests/processors/ToolResponseCache.test.js +0 -657
- package/ts_build/tests/processors/ToolResponseCache.test.js.map +0 -1
- package/ts_build/tests/processors/tools/boundedRetrievalTools.test.d.ts +0 -1
- package/ts_build/tests/processors/tools/boundedRetrievalTools.test.js +0 -57
- package/ts_build/tests/processors/tools/boundedRetrievalTools.test.js.map +0 -1
- package/ts_build/tests/processors/tools/grepToolResponse.test.d.ts +0 -1
- package/ts_build/tests/processors/tools/grepToolResponse.test.js +0 -77
- package/ts_build/tests/processors/tools/grepToolResponse.test.js.map +0 -1
- package/ts_build/tests/services/ConversionService.test.d.ts +0 -1
- package/ts_build/tests/services/ConversionService.test.js +0 -154
- package/ts_build/tests/services/ConversionService.test.js.map +0 -1
- package/ts_build/tests/services/DockerService.test.d.ts +0 -1
- package/ts_build/tests/services/DockerService.test.js +0 -22
- package/ts_build/tests/services/DockerService.test.js.map +0 -1
- package/ts_build/tests/services/Tools.test.d.ts +0 -1
- package/ts_build/tests/services/Tools.test.js +0 -1365
- package/ts_build/tests/services/Tools.test.js.map +0 -1
- package/ts_build/tests/services/ToolsService.setFunction.test.d.ts +0 -1
- package/ts_build/tests/services/ToolsService.setFunction.test.js +0 -51
- package/ts_build/tests/services/ToolsService.setFunction.test.js.map +0 -1
- package/ts_build/tests/services/WorkerReloadConfig.test.d.ts +0 -1
- package/ts_build/tests/services/WorkerReloadConfig.test.js +0 -86
- package/ts_build/tests/services/WorkerReloadConfig.test.js.map +0 -1
- package/ts_build/tests/test.spec.d.ts +0 -1
- package/ts_build/tests/test.spec.js +0 -139
- package/ts_build/tests/test.spec.js.map +0 -1
- package/ts_build/tests/unit/InputQueueManager.test.d.ts +0 -1
- package/ts_build/tests/unit/InputQueueManager.test.js +0 -104
- package/ts_build/tests/unit/InputQueueManager.test.js.map +0 -1
- package/ts_build/tests/unit/McpWebsocketTransport.test.d.ts +0 -1
- package/ts_build/tests/unit/McpWebsocketTransport.test.js +0 -47
- package/ts_build/tests/unit/McpWebsocketTransport.test.js.map +0 -1
- package/ts_build/tests/unit/agents/historyRollback.test.d.ts +0 -1
- package/ts_build/tests/unit/agents/historyRollback.test.js +0 -42
- package/ts_build/tests/unit/agents/historyRollback.test.js.map +0 -1
- package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.d.ts +0 -1
- package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.js +0 -67
- package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.js.map +0 -1
- package/ts_build/tests/unit/auth/jwtStore.test.d.ts +0 -1
- package/ts_build/tests/unit/auth/jwtStore.test.js +0 -46
- package/ts_build/tests/unit/auth/jwtStore.test.js.map +0 -1
- package/ts_build/tests/unit/auth/keyAuth.test.d.ts +0 -1
- package/ts_build/tests/unit/auth/keyAuth.test.js +0 -118
- package/ts_build/tests/unit/auth/keyAuth.test.js.map +0 -1
- package/ts_build/tests/unit/auth/keyManager.test.d.ts +0 -1
- package/ts_build/tests/unit/auth/keyManager.test.js +0 -96
- package/ts_build/tests/unit/auth/keyManager.test.js.map +0 -1
- package/ts_build/tests/unit/auth/registerIdentity.test.d.ts +0 -1
- package/ts_build/tests/unit/auth/registerIdentity.test.js +0 -92
- package/ts_build/tests/unit/auth/registerIdentity.test.js.map +0 -1
- package/ts_build/tests/unit/chat/ToolCommandModule.test.d.ts +0 -1
- package/ts_build/tests/unit/chat/ToolCommandModule.test.js +0 -61
- package/ts_build/tests/unit/chat/ToolCommandModule.test.js.map +0 -1
- package/ts_build/tests/unit/chat/historyCommandArgs.test.d.ts +0 -1
- package/ts_build/tests/unit/chat/historyCommandArgs.test.js +0 -29
- package/ts_build/tests/unit/chat/historyCommandArgs.test.js.map +0 -1
- package/ts_build/tests/unit/clients/AIClient.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/AIClient.test.js +0 -342
- package/ts_build/tests/unit/clients/AIClient.test.js.map +0 -1
- package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.js +0 -77
- package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.js.map +0 -1
- package/ts_build/tests/unit/clients/attribution.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/attribution.test.js +0 -153
- package/ts_build/tests/unit/clients/attribution.test.js.map +0 -1
- package/ts_build/tests/unit/clients/http.responseMetadata.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/http.responseMetadata.test.js +0 -77
- package/ts_build/tests/unit/clients/http.responseMetadata.test.js.map +0 -1
- package/ts_build/tests/unit/clients/openai.responseMetadata.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/openai.responseMetadata.test.js +0 -86
- package/ts_build/tests/unit/clients/openai.responseMetadata.test.js.map +0 -1
- package/ts_build/tests/unit/clients/responseMetadata.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/responseMetadata.test.js +0 -96
- package/ts_build/tests/unit/clients/responseMetadata.test.js.map +0 -1
- package/ts_build/tests/unit/clients/withRetry.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/withRetry.test.js +0 -225
- package/ts_build/tests/unit/clients/withRetry.test.js.map +0 -1
- package/ts_build/tests/unit/commands/agents.test.d.ts +0 -1
- package/ts_build/tests/unit/commands/agents.test.js +0 -119
- package/ts_build/tests/unit/commands/agents.test.js.map +0 -1
- package/ts_build/tests/unit/commands/github-credentials.test.d.ts +0 -1
- package/ts_build/tests/unit/commands/github-credentials.test.js +0 -145
- package/ts_build/tests/unit/commands/github-credentials.test.js.map +0 -1
- package/ts_build/tests/unit/commands/misc.test.d.ts +0 -1
- package/ts_build/tests/unit/commands/misc.test.js +0 -70
- package/ts_build/tests/unit/commands/misc.test.js.map +0 -1
- package/ts_build/tests/unit/commands/remote.test.d.ts +0 -1
- package/ts_build/tests/unit/commands/remote.test.js +0 -70
- package/ts_build/tests/unit/commands/remote.test.js.map +0 -1
- package/ts_build/tests/unit/commands/sandbox.test.d.ts +0 -1
- package/ts_build/tests/unit/commands/sandbox.test.js +0 -258
- package/ts_build/tests/unit/commands/sandbox.test.js.map +0 -1
- package/ts_build/tests/unit/hashes.test.d.ts +0 -1
- package/ts_build/tests/unit/hashes.test.js +0 -25
- package/ts_build/tests/unit/hashes.test.js.map +0 -1
- package/ts_build/tests/unit/input-queue.test.d.ts +0 -1
- package/ts_build/tests/unit/input-queue.test.js +0 -32
- package/ts_build/tests/unit/input-queue.test.js.map +0 -1
- package/ts_build/tests/unit/login.test.d.ts +0 -1
- package/ts_build/tests/unit/login.test.js +0 -166
- package/ts_build/tests/unit/login.test.js.map +0 -1
- package/ts_build/tests/unit/modules/moduleLoading.test.d.ts +0 -1
- package/ts_build/tests/unit/modules/moduleLoading.test.js +0 -272
- package/ts_build/tests/unit/modules/moduleLoading.test.js.map +0 -1
- package/ts_build/tests/unit/plugins/pluginLoading.test.d.ts +0 -1
- package/ts_build/tests/unit/plugins/pluginLoading.test.js +0 -117
- package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +0 -1
- package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.d.ts +0 -1
- package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js +0 -32
- package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js.map +0 -1
- package/ts_build/tests/unit/services/KnowhowClient.test.d.ts +0 -1
- package/ts_build/tests/unit/services/KnowhowClient.test.js +0 -69
- package/ts_build/tests/unit/services/KnowhowClient.test.js.map +0 -1
- package/ts_build/tests/unit/services/LazyToolsService.test.d.ts +0 -1
- package/ts_build/tests/unit/services/LazyToolsService.test.js +0 -47
- package/ts_build/tests/unit/services/LazyToolsService.test.js.map +0 -1
- package/ts_build/tests/unit/services/Mcp.test.d.ts +0 -1
- package/ts_build/tests/unit/services/Mcp.test.js +0 -45
- package/ts_build/tests/unit/services/Mcp.test.js.map +0 -1
- package/ts_build/tests/unit/services/MinimalToolsService.test.d.ts +0 -1
- package/ts_build/tests/unit/services/MinimalToolsService.test.js +0 -320
- package/ts_build/tests/unit/services/MinimalToolsService.test.js.map +0 -1
- package/ts_build/tests/unit/services/RuntimeReloadService.test.d.ts +0 -1
- package/ts_build/tests/unit/services/RuntimeReloadService.test.js +0 -26
- package/ts_build/tests/unit/services/RuntimeReloadService.test.js.map +0 -1
- package/ts_build/tests/unit/services/SessionManager.test.d.ts +0 -1
- package/ts_build/tests/unit/services/SessionManager.test.js +0 -72
- package/ts_build/tests/unit/services/SessionManager.test.js.map +0 -1
- package/ts_build/tests/unit/services/SyncedAgentWatcher.test.d.ts +0 -1
- package/ts_build/tests/unit/services/SyncedAgentWatcher.test.js +0 -78
- package/ts_build/tests/unit/services/SyncedAgentWatcher.test.js.map +0 -1
- package/ts_build/tests/unit/services/SyncerService.test.d.ts +0 -1
- package/ts_build/tests/unit/services/SyncerService.test.js +0 -40
- package/ts_build/tests/unit/services/SyncerService.test.js.map +0 -1
- package/ts_build/tests/unit/tunnel.test.d.ts +0 -1
- package/ts_build/tests/unit/tunnel.test.js +0 -47
- package/ts_build/tests/unit/tunnel.test.js.map +0 -1
- package/ts_build/tests/unit/util/Trace.test.d.ts +0 -1
- package/ts_build/tests/unit/util/Trace.test.js +0 -107
- package/ts_build/tests/unit/util/Trace.test.js.map +0 -1
- package/ts_build/tests/unit/utils/http.test.d.ts +0 -1
- package/ts_build/tests/unit/utils/http.test.js +0 -69
- package/ts_build/tests/unit/utils/http.test.js.map +0 -1
- package/tsconfig.json +0 -34
- 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
|
-
}
|