@tyvm/knowhow 0.0.158 → 0.0.160
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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/utils/InputQueueManager.d.ts +8 -1
- package/ts_build/src/utils/InputQueueManager.js +72 -2
- 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/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
package/src/auth/browserLogin.ts
DELETED
|
@@ -1,406 +0,0 @@
|
|
|
1
|
-
import http from "../utils/http";
|
|
2
|
-
import { exec } from "child_process";
|
|
3
|
-
import { promisify } from "util";
|
|
4
|
-
import crypto from "crypto";
|
|
5
|
-
import * as os from "os";
|
|
6
|
-
import * as fs from "fs";
|
|
7
|
-
import * as path from "path";
|
|
8
|
-
import { KNOWHOW_API_URL } from "../services/KnowhowClient";
|
|
9
|
-
import { Spinner } from "./spinner";
|
|
10
|
-
import { BrowserLoginError } from "./errors";
|
|
11
|
-
import { storeJwtForApi } from "./jwtStore";
|
|
12
|
-
|
|
13
|
-
// TypeScript interfaces for the CLI Login API
|
|
14
|
-
|
|
15
|
-
interface CreateSessionResponse {
|
|
16
|
-
sessionId: string;
|
|
17
|
-
browserUrl: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
interface SessionStatusResponse {
|
|
21
|
-
status: "pending" | "approved" | "denied" | "expired";
|
|
22
|
-
userId?: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
interface RetrieveTokenResponse {
|
|
26
|
-
jwt: string;
|
|
27
|
-
requiresDeviceConfirmation?: boolean;
|
|
28
|
-
jwtSessionId?: string;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export class BrowserLoginService {
|
|
32
|
-
private baseUrl: string;
|
|
33
|
-
/** PKCE verifier — generated once per login attempt, never sent in a URL */
|
|
34
|
-
private verifier: string = crypto.randomBytes(32).toString("hex");
|
|
35
|
-
|
|
36
|
-
constructor(baseUrl: string = KNOWHOW_API_URL, private orgId?: string) {
|
|
37
|
-
if (!baseUrl) {
|
|
38
|
-
throw new BrowserLoginError(
|
|
39
|
-
"KNOWHOW_API_URL environment variable not set"
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
this.baseUrl = baseUrl;
|
|
43
|
-
this.setupSignalHandlers();
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Main login method that orchestrates the browser-based authentication flow
|
|
48
|
-
*/
|
|
49
|
-
async login(): Promise<void> {
|
|
50
|
-
const spinner = new Spinner();
|
|
51
|
-
let isAborted = false;
|
|
52
|
-
|
|
53
|
-
try {
|
|
54
|
-
spinner.start("Creating login session");
|
|
55
|
-
|
|
56
|
-
// Step 1: Create login session
|
|
57
|
-
const sessionData = await this.createSession();
|
|
58
|
-
spinner.stop();
|
|
59
|
-
spinner.start("Opening browser for authentication");
|
|
60
|
-
|
|
61
|
-
// Step 2: Open browser
|
|
62
|
-
let browserUrl = sessionData.browserUrl;
|
|
63
|
-
// Append orgId as query string so the frontend can pre-select the correct organization
|
|
64
|
-
if (this.orgId) {
|
|
65
|
-
const separator = browserUrl.includes("?") ? "&" : "?";
|
|
66
|
-
browserUrl = `${browserUrl}${separator}orgId=${encodeURIComponent(this.orgId)}`;
|
|
67
|
-
}
|
|
68
|
-
await openBrowser(browserUrl);
|
|
69
|
-
console.log(
|
|
70
|
-
`\nIf the browser didn't open automatically, please visit: ${browserUrl}\n`
|
|
71
|
-
);
|
|
72
|
-
spinner.stop();
|
|
73
|
-
spinner.start("Waiting for browser authentication");
|
|
74
|
-
|
|
75
|
-
// Set up cancellation handler
|
|
76
|
-
const abortHandler = () => {
|
|
77
|
-
isAborted = true;
|
|
78
|
-
spinner.stop();
|
|
79
|
-
};
|
|
80
|
-
process.once("SIGINT", abortHandler);
|
|
81
|
-
|
|
82
|
-
let attempt = 0;
|
|
83
|
-
const maxAttempts = 60; // 5 minutes with 5 second intervals
|
|
84
|
-
|
|
85
|
-
while (attempt < maxAttempts) {
|
|
86
|
-
attempt++;
|
|
87
|
-
|
|
88
|
-
try {
|
|
89
|
-
if (isAborted) {
|
|
90
|
-
throw new BrowserLoginError(
|
|
91
|
-
"Authentication cancelled by user",
|
|
92
|
-
"USER_CANCELLED"
|
|
93
|
-
);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const statusResponse = await http.get(
|
|
97
|
-
`${this.baseUrl}/api/cli-login/session/${sessionData.sessionId}/status`,
|
|
98
|
-
{ timeout: 10000 }
|
|
99
|
-
);
|
|
100
|
-
|
|
101
|
-
const status = statusResponse.data as SessionStatusResponse;
|
|
102
|
-
|
|
103
|
-
if (status.status.toLowerCase() === "approved") {
|
|
104
|
-
spinner.stop();
|
|
105
|
-
spinner.start("Authentication successful! Retrieving token");
|
|
106
|
-
|
|
107
|
-
// Step 4: Redeem session using PKCE verifier (never sent in URL)
|
|
108
|
-
const tokenResponse = await http.post(
|
|
109
|
-
`${this.baseUrl}/api/cli-login/session/${sessionData.sessionId}/redeem`,
|
|
110
|
-
{ verifier: this.verifier }
|
|
111
|
-
);
|
|
112
|
-
|
|
113
|
-
const tokenData = tokenResponse.data as RetrieveTokenResponse;
|
|
114
|
-
spinner.stop();
|
|
115
|
-
|
|
116
|
-
if (tokenData.requiresDeviceConfirmation) {
|
|
117
|
-
// Token was issued but the device needs confirmation via email code.
|
|
118
|
-
// Store it now so it's ready once confirmed.
|
|
119
|
-
if (tokenData.jwt) {
|
|
120
|
-
await this.storeJwt(tokenData.jwt);
|
|
121
|
-
}
|
|
122
|
-
console.log("\n⚠️ New device detected — device confirmation required!");
|
|
123
|
-
console.log("─────────────────────────────────────────────────────");
|
|
124
|
-
console.log("A confirmation code has been sent to your email.");
|
|
125
|
-
console.log("You must confirm this device in your browser to complete login.");
|
|
126
|
-
console.log("\nPlease check the browser window you just used to approve the CLI session.");
|
|
127
|
-
console.log("Enter the email code there to confirm this device.");
|
|
128
|
-
console.log("\nAlternatively, visit your settings page:");
|
|
129
|
-
console.log(` ${process.env.KNOWHOW_FRONTEND_URL || "https://knowhow.tyvm.ai"}/settings?tab=security`);
|
|
130
|
-
console.log("─────────────────────────────────────────────────────\n");
|
|
131
|
-
|
|
132
|
-
// Wait for the user to confirm the device — poll /api/users/me until
|
|
133
|
-
// the session becomes ACTIVE (device confirmed) or we time out.
|
|
134
|
-
await this.waitForDeviceConfirmation(tokenData.jwt);
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
await this.storeJwt(tokenData.jwt);
|
|
139
|
-
return;
|
|
140
|
-
} else if (status.status.toLowerCase() === "denied") {
|
|
141
|
-
throw new BrowserLoginError(
|
|
142
|
-
"Authentication was denied",
|
|
143
|
-
"AUTH_DENIED"
|
|
144
|
-
);
|
|
145
|
-
} else if (status.status.toLowerCase() === "expired") {
|
|
146
|
-
throw new BrowserLoginError(
|
|
147
|
-
"Authentication session expired",
|
|
148
|
-
"SESSION_EXPIRED"
|
|
149
|
-
);
|
|
150
|
-
}
|
|
151
|
-
} catch (error) {
|
|
152
|
-
if (http.isHttpError(error) && error.status !== 408) {
|
|
153
|
-
throw new BrowserLoginError(
|
|
154
|
-
`Network error: ${error.message}`,
|
|
155
|
-
"NETWORK_ERROR"
|
|
156
|
-
);
|
|
157
|
-
}
|
|
158
|
-
// Ignore timeout errors, continue polling
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
await this.sleep(5000); // Wait 5 seconds between attempts
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
process.removeListener("SIGINT", abortHandler);
|
|
165
|
-
|
|
166
|
-
throw new BrowserLoginError("Authentication timed out", "TIMEOUT");
|
|
167
|
-
} catch (error) {
|
|
168
|
-
spinner.stop();
|
|
169
|
-
throw error;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Creates a new login session with the API
|
|
175
|
-
*/
|
|
176
|
-
private async createSession(): Promise<CreateSessionResponse> {
|
|
177
|
-
try {
|
|
178
|
-
// Compute the PKCE challenge (sha256 of verifier) to store server-side
|
|
179
|
-
const challenge = crypto.createHash("sha256").update(this.verifier, "utf8").digest("hex");
|
|
180
|
-
const response = await http.post<CreateSessionResponse>(
|
|
181
|
-
`${this.baseUrl}/api/cli-login/session`,
|
|
182
|
-
{ challenge },
|
|
183
|
-
{ headers: { "User-Agent": getCliUserAgent() } }
|
|
184
|
-
);
|
|
185
|
-
return response.data;
|
|
186
|
-
} catch (error) {
|
|
187
|
-
if (http.isHttpError(error)) {
|
|
188
|
-
throw new BrowserLoginError(
|
|
189
|
-
`Failed to create login session: ${error.message}`,
|
|
190
|
-
"SESSION_CREATE_FAILED"
|
|
191
|
-
);
|
|
192
|
-
}
|
|
193
|
-
throw new BrowserLoginError(
|
|
194
|
-
`Unexpected error creating session: ${(error as Error).message}`
|
|
195
|
-
);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Securely stores the JWT token to the file system
|
|
201
|
-
*/
|
|
202
|
-
private async storeJwt(jwt: string): Promise<void> {
|
|
203
|
-
storeJwtForApi(jwt, this.baseUrl);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Utility method for creating delays
|
|
208
|
-
*/
|
|
209
|
-
private async sleep(ms: number): Promise<void> {
|
|
210
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Poll /api/users/me with the pending JWT until the device confirmation is
|
|
215
|
-
* completed (session becomes ACTIVE) or we time out (~10 minutes).
|
|
216
|
-
* Shows a spinner so the user knows the CLI is still waiting.
|
|
217
|
-
*/
|
|
218
|
-
private async waitForDeviceConfirmation(jwt: string): Promise<void> {
|
|
219
|
-
const spinner = new Spinner();
|
|
220
|
-
spinner.start("Waiting for device confirmation");
|
|
221
|
-
|
|
222
|
-
let isCancelled = false;
|
|
223
|
-
const cancelHandler = () => {
|
|
224
|
-
isCancelled = true;
|
|
225
|
-
spinner.stop();
|
|
226
|
-
console.log("\n\nCancelled. Your token is stored — once you confirm the device, re-run your command.");
|
|
227
|
-
process.exit(0);
|
|
228
|
-
};
|
|
229
|
-
process.once("SIGINT", cancelHandler);
|
|
230
|
-
|
|
231
|
-
const maxAttempts = 120; // 10 minutes at 5-second intervals
|
|
232
|
-
let attempt = 0;
|
|
233
|
-
|
|
234
|
-
while (attempt < maxAttempts) {
|
|
235
|
-
attempt++;
|
|
236
|
-
|
|
237
|
-
// Sleep in small increments so SIGINT can be checked more responsively
|
|
238
|
-
for (let i = 0; i < 10; i++) {
|
|
239
|
-
await this.sleep(500);
|
|
240
|
-
if (isCancelled) return;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
try {
|
|
244
|
-
const response = await http.get(`${this.baseUrl}/api/users/me`, {
|
|
245
|
-
headers: { Authorization: `Bearer ${jwt}` },
|
|
246
|
-
timeout: 10000,
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
if (response.status === 200) {
|
|
250
|
-
// Device confirmed — session is now ACTIVE
|
|
251
|
-
spinner.stop();
|
|
252
|
-
process.removeListener("SIGINT", cancelHandler);
|
|
253
|
-
console.log("✅ Device confirmed! You are now logged in.");
|
|
254
|
-
return;
|
|
255
|
-
}
|
|
256
|
-
} catch (error) {
|
|
257
|
-
if (http.isHttpError(error)) {
|
|
258
|
-
if (error.status === 403) {
|
|
259
|
-
// Still pending — keep waiting
|
|
260
|
-
continue;
|
|
261
|
-
}
|
|
262
|
-
if (error.status === 401) {
|
|
263
|
-
// 401 can mean:
|
|
264
|
-
// - Session not found yet (timing issue, check-device may not have run)
|
|
265
|
-
// - Session is PENDING_DEVICE_CONFIRMATION (some backend versions return 401)
|
|
266
|
-
// - Token was actually revoked/expired
|
|
267
|
-
// Keep polling for the first ~5 attempts before giving up, to handle timing issues.
|
|
268
|
-
if (attempt >= 10) {
|
|
269
|
-
spinner.stop();
|
|
270
|
-
process.removeListener("SIGINT", cancelHandler);
|
|
271
|
-
throw new BrowserLoginError(
|
|
272
|
-
"Token expired or revoked during device confirmation. Please run 'knowhow login' again.",
|
|
273
|
-
"TOKEN_EXPIRED"
|
|
274
|
-
);
|
|
275
|
-
}
|
|
276
|
-
continue;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
spinner.stop();
|
|
283
|
-
process.removeListener("SIGINT", cancelHandler);
|
|
284
|
-
console.log("\n⏰ Timed out waiting for device confirmation.");
|
|
285
|
-
console.log("Your token is stored — once you confirm the device at:");
|
|
286
|
-
console.log(` ${process.env.KNOWHOW_FRONTEND_URL || "https://knowhow.tyvm.ai"}/settings?tab=security`);
|
|
287
|
-
console.log("you can re-run your command and it will work.\n");
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
/**
|
|
291
|
-
* Set up signal handlers for graceful shutdown
|
|
292
|
-
*/
|
|
293
|
-
private setupSignalHandlers(): void {
|
|
294
|
-
const gracefulShutdown = () => {
|
|
295
|
-
console.log("\n\nAuthentication cancelled by user.");
|
|
296
|
-
process.exit(1);
|
|
297
|
-
};
|
|
298
|
-
|
|
299
|
-
process.on("SIGTERM", gracefulShutdown);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* Build a descriptive User-Agent string for CLI sessions so they show up
|
|
305
|
-
* with meaningful device info in the sessions UI (e.g. "Knowhow CLI on macOS").
|
|
306
|
-
*/
|
|
307
|
-
export function getCliUserAgent(): string {
|
|
308
|
-
let cliVersion = "unknown";
|
|
309
|
-
try {
|
|
310
|
-
// __dirname is ts_build/src/auth/ at runtime, so go up 3 levels to package root
|
|
311
|
-
const pkgPath = path.resolve(__dirname, "../../../package.json");
|
|
312
|
-
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
313
|
-
cliVersion = pkg.version ?? "unknown";
|
|
314
|
-
} catch {
|
|
315
|
-
// ignore — version is cosmetic
|
|
316
|
-
}
|
|
317
|
-
const platform = os.platform();
|
|
318
|
-
const osName =
|
|
319
|
-
platform === "darwin" ? "macOS" :
|
|
320
|
-
platform === "win32" ? "Windows" :
|
|
321
|
-
platform === "linux" ? "Linux" : platform;
|
|
322
|
-
return `Knowhow CLI/${cliVersion} (${osName})`;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Utility function to open a URL in the default browser across different platforms
|
|
327
|
-
*/
|
|
328
|
-
export async function openBrowser(url: string): Promise<void> {
|
|
329
|
-
const execAsync = promisify(exec);
|
|
330
|
-
|
|
331
|
-
try {
|
|
332
|
-
const platform = os.platform();
|
|
333
|
-
console.log(`Opening browser for URL: ${url} on platform: ${platform}`);
|
|
334
|
-
|
|
335
|
-
let command: string;
|
|
336
|
-
switch (platform) {
|
|
337
|
-
case "darwin": // macOS
|
|
338
|
-
command = `open "${url}"`;
|
|
339
|
-
break;
|
|
340
|
-
case "win32": // Windows
|
|
341
|
-
command = `start "" "${url}"`;
|
|
342
|
-
break;
|
|
343
|
-
default: // Linux and others
|
|
344
|
-
command = `xdg-open "${url}"`;
|
|
345
|
-
break;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
await execAsync(command);
|
|
349
|
-
} catch (error) {
|
|
350
|
-
// If we can't open the browser automatically, that's not a fatal error
|
|
351
|
-
// The user can still manually navigate to the URL
|
|
352
|
-
console.warn(`Could not automatically open browser: ${(error as Error).message}`);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
/**
|
|
357
|
-
* Utility function to validate JWT format (basic validation)
|
|
358
|
-
*/
|
|
359
|
-
export function validateJwt(jwt: string): boolean {
|
|
360
|
-
if (!jwt || typeof jwt !== "string") {
|
|
361
|
-
return false;
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
// Basic JWT structure check: should have exactly 3 parts separated by dots
|
|
365
|
-
const parts = jwt.split(".");
|
|
366
|
-
if (parts.length !== 3) {
|
|
367
|
-
return false;
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
// Check that each part is non-empty
|
|
371
|
-
for (const part of parts) {
|
|
372
|
-
if (!part || part.trim().length === 0) {
|
|
373
|
-
return false;
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
// If this looks like a real JWT (contains base64-like characters), validate it strictly
|
|
378
|
-
const looksLikeRealJwt = parts.every(part => /^[A-Za-z0-9+/\-_]+={0,2}$/.test(part));
|
|
379
|
-
|
|
380
|
-
if (looksLikeRealJwt) {
|
|
381
|
-
// Strict validation for real JWTs
|
|
382
|
-
try {
|
|
383
|
-
// Try to decode header and payload as valid JSON
|
|
384
|
-
JSON.parse(Buffer.from(parts[0], "base64").toString());
|
|
385
|
-
JSON.parse(Buffer.from(parts[1], "base64").toString());
|
|
386
|
-
|
|
387
|
-
// Try to decode signature - should be valid base64 with reasonable length
|
|
388
|
-
const signature = Buffer.from(parts[2], "base64");
|
|
389
|
-
|
|
390
|
-
// JWT signatures are typically at least 32 bytes (256 bits)
|
|
391
|
-
if (signature.length < 32) {
|
|
392
|
-
return false;
|
|
393
|
-
}
|
|
394
|
-
} catch (error) {
|
|
395
|
-
// If any part fails to decode properly, it's not a valid JWT
|
|
396
|
-
return false;
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
// For simple test cases like 'part1.part2.part3', just check basic structure
|
|
401
|
-
try {
|
|
402
|
-
return true;
|
|
403
|
-
} catch {
|
|
404
|
-
return true; // For basic format tests, structure check is enough
|
|
405
|
-
}
|
|
406
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { Config } from "../types";
|
|
2
|
-
import { loadJwtFromDisk } from "./jwtStore";
|
|
3
|
-
import { createRemote, findRemoteForApi, registerRemote } from "../remotes";
|
|
4
|
-
|
|
5
|
-
/** Stable config key for authentication state owned by one API deployment. */
|
|
6
|
-
export function getApiEnvironmentKey(apiUrl: string): string {
|
|
7
|
-
try {
|
|
8
|
-
const url = new URL(apiUrl);
|
|
9
|
-
return `${url.protocol}//${url.host}`.toLowerCase();
|
|
10
|
-
} catch {
|
|
11
|
-
return apiUrl.replace(/\/+$/, "").toLowerCase();
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/** Read an organization claim without trusting the JWT for authorization. */
|
|
16
|
-
export function getOrgIdFromJwt(jwt: string): string | undefined {
|
|
17
|
-
try {
|
|
18
|
-
const payload = JSON.parse(
|
|
19
|
-
Buffer.from(jwt.split(".")[1] ?? "", "base64url").toString("utf8")
|
|
20
|
-
) as Record<string, unknown>;
|
|
21
|
-
const orgId = payload.org ?? payload.orgId ?? payload.org_id ?? payload.organizationId;
|
|
22
|
-
return typeof orgId === "string" && orgId ? orgId : undefined;
|
|
23
|
-
} catch {
|
|
24
|
-
return undefined;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/** Resolve the org for the selected API without leaking another environment's org. */
|
|
29
|
-
export function getOrgIdForApi(config: Config, apiUrl: string): string | undefined {
|
|
30
|
-
const remote = findRemoteForApi(config, apiUrl);
|
|
31
|
-
if (remote?.orgId) return remote.orgId;
|
|
32
|
-
|
|
33
|
-
// Read old orgIds only until this API has been represented as a remote.
|
|
34
|
-
const environmentKey = getApiEnvironmentKey(apiUrl);
|
|
35
|
-
const configured = config.orgIds?.[environmentKey];
|
|
36
|
-
if (configured) return configured;
|
|
37
|
-
|
|
38
|
-
const tokenOrgId = getOrgIdFromJwt(loadJwtFromDisk(apiUrl));
|
|
39
|
-
if (tokenOrgId) return tokenOrgId;
|
|
40
|
-
|
|
41
|
-
return config.remotes || (config.orgIds && Object.keys(config.orgIds).length > 0)
|
|
42
|
-
? undefined
|
|
43
|
-
: config.orgId;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/** Record authentication state on the remote that owns it. */
|
|
47
|
-
export function setOrgIdForApi(config: Config, apiUrl: string, orgId: string): void {
|
|
48
|
-
const remote = findRemoteForApi(config, apiUrl) ?? createRemote("origin", apiUrl);
|
|
49
|
-
registerRemote(config, { ...remote, orgId });
|
|
50
|
-
delete config.orgId;
|
|
51
|
-
}
|
package/src/auth/errors.ts
DELETED
package/src/auth/jwtStore.ts
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import fs from "fs";
|
|
2
|
-
import path from "path";
|
|
3
|
-
import { findRemoteForApiSync, resolveJwtPath } from "../remotes";
|
|
4
|
-
|
|
5
|
-
const PRODUCTION_API_HOST = "api.knowhow.tyvm.ai";
|
|
6
|
-
|
|
7
|
-
/** Return a readable, environment-specific JWT filename for an API URL. */
|
|
8
|
-
export function getJwtFileName(apiUrl: string): string {
|
|
9
|
-
try {
|
|
10
|
-
const { hostname, port } = new URL(apiUrl);
|
|
11
|
-
const normalizedHost = hostname.toLowerCase();
|
|
12
|
-
|
|
13
|
-
if (normalizedHost === PRODUCTION_API_HOST) return ".jwt";
|
|
14
|
-
if (
|
|
15
|
-
normalizedHost === "localhost" ||
|
|
16
|
-
normalizedHost === "::1" ||
|
|
17
|
-
normalizedHost.startsWith("127.")
|
|
18
|
-
) {
|
|
19
|
-
return ".jwt.local";
|
|
20
|
-
}
|
|
21
|
-
if (normalizedHost === "api.dev.knowhow.tyvm.ai" || normalizedHost.includes(".dev.")) {
|
|
22
|
-
return ".jwt.dev";
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const environment = `${normalizedHost}${port ? `-${port}` : ""}`
|
|
26
|
-
.replace(/[^a-z0-9.-]+/g, "-")
|
|
27
|
-
.replace(/^-+|-+$/g, "");
|
|
28
|
-
return environment ? `.jwt.${environment}` : ".jwt";
|
|
29
|
-
} catch {
|
|
30
|
-
return ".jwt";
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function getJwtFilePath(
|
|
35
|
-
apiUrl: string,
|
|
36
|
-
configDir = path.join(process.cwd(), ".knowhow")
|
|
37
|
-
): string {
|
|
38
|
-
return path.join(configDir, getJwtFileName(apiUrl));
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Load the JWT selected for an environment. The optional legacy path provides
|
|
43
|
-
* the directory for configs that historically pointed at `.jwt`.
|
|
44
|
-
*/
|
|
45
|
-
export function loadJwtFromDisk(apiUrl: string, legacyPath?: string): string {
|
|
46
|
-
const basePath = legacyPath ?? path.join(process.cwd(), ".knowhow", ".jwt");
|
|
47
|
-
const configuredPath = findRemoteForApiSync(apiUrl)?.jwtPath;
|
|
48
|
-
const jwtPath = configuredPath
|
|
49
|
-
? resolveJwtPath(configuredPath)
|
|
50
|
-
: path.join(path.dirname(basePath), getJwtFileName(apiUrl));
|
|
51
|
-
return fs.existsSync(jwtPath)
|
|
52
|
-
? fs.readFileSync(jwtPath, "utf8").trim()
|
|
53
|
-
: "";
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/** Atomically store a JWT in the file selected for the API environment. */
|
|
57
|
-
export function storeJwtForApi(jwt: string, apiUrl: string, configuredPath?: string): string {
|
|
58
|
-
const jwtFilePath = configuredPath ? resolveJwtPath(configuredPath) : getJwtFilePath(apiUrl);
|
|
59
|
-
const directory = path.dirname(jwtFilePath);
|
|
60
|
-
const temporaryPath = `${jwtFilePath}.${process.pid}.tmp`;
|
|
61
|
-
fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
62
|
-
try {
|
|
63
|
-
fs.writeFileSync(temporaryPath, jwt, { mode: 0o600, flag: "wx" });
|
|
64
|
-
fs.renameSync(temporaryPath, jwtFilePath);
|
|
65
|
-
fs.chmodSync(jwtFilePath, 0o600);
|
|
66
|
-
} finally {
|
|
67
|
-
fs.rmSync(temporaryPath, { force: true });
|
|
68
|
-
}
|
|
69
|
-
return jwtFilePath;
|
|
70
|
-
}
|
package/src/auth/keyAuth.ts
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import os from "os";
|
|
2
|
-
import http from "../utils/http";
|
|
3
|
-
import { getCliUserAgent } from "./browserLogin";
|
|
4
|
-
import { storeJwtForApi } from "./jwtStore";
|
|
5
|
-
import {
|
|
6
|
-
getDefaultPrivateKeyPath,
|
|
7
|
-
keyPairExists,
|
|
8
|
-
loadKeyPair,
|
|
9
|
-
signMessage,
|
|
10
|
-
} from "./keyManager";
|
|
11
|
-
|
|
12
|
-
const DEFAULT_API_URL = process.env.KNOWHOW_API_URL || "https://api.knowhow.tyvm.ai";
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* This is intentionally based only on the selected identity. Registration is
|
|
16
|
-
* server-side and scoped to its environment/user/org; a local `.registered`
|
|
17
|
-
* marker cannot safely represent that state. An unknown or revoked key is
|
|
18
|
-
* cheaply rejected by the selected API and login then falls back to PKCE.
|
|
19
|
-
*/
|
|
20
|
-
export function hasKeyPair(privateKeyPath?: string): boolean {
|
|
21
|
-
return keyPairExists(privateKeyPath);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/** Exchange a registered Ed25519 identity for a new short-lived JWT. */
|
|
25
|
-
export async function exchangePublicKeyJwt(
|
|
26
|
-
orgId: string,
|
|
27
|
-
apiUrl: string = DEFAULT_API_URL,
|
|
28
|
-
privateKeyPath?: string
|
|
29
|
-
): Promise<string> {
|
|
30
|
-
if (!keyPairExists(privateKeyPath)) {
|
|
31
|
-
throw new Error("CLI identity is unavailable");
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const keyPair = loadKeyPair(privateKeyPath);
|
|
35
|
-
const headers = { "User-Agent": getCliUserAgent() };
|
|
36
|
-
const challengeResponse = await http.post<{
|
|
37
|
-
challengeId: string;
|
|
38
|
-
message: string;
|
|
39
|
-
expiresAt: string;
|
|
40
|
-
}>(
|
|
41
|
-
`${apiUrl}/api/public-keys/challenge`,
|
|
42
|
-
{ publicKey: keyPair.publicKeyBase64, orgId },
|
|
43
|
-
{ headers }
|
|
44
|
-
);
|
|
45
|
-
const { challengeId, message } = challengeResponse.data;
|
|
46
|
-
if (
|
|
47
|
-
typeof challengeId !== "string" ||
|
|
48
|
-
challengeId.length === 0 ||
|
|
49
|
-
challengeId.length > 128 ||
|
|
50
|
-
!/^[A-Za-z0-9_-]+$/.test(challengeId) ||
|
|
51
|
-
typeof message !== "string" ||
|
|
52
|
-
message.length === 0
|
|
53
|
-
) {
|
|
54
|
-
throw new Error("Public-key challenge response is invalid");
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const response = await http.post<{ jwt: string }>(
|
|
58
|
-
`${apiUrl}/api/public-keys/authenticate`,
|
|
59
|
-
{ challengeId, signature: signMessage(message, privateKeyPath) },
|
|
60
|
-
{ headers }
|
|
61
|
-
);
|
|
62
|
-
if (!response.data.jwt) {
|
|
63
|
-
throw new Error("Public-key authentication returned no JWT");
|
|
64
|
-
}
|
|
65
|
-
return response.data.jwt;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Try the configured identity first, then the default CLI identity. Project
|
|
70
|
-
* configs can outlive temporary/custom keys, while the globally registered
|
|
71
|
-
* default identity remains valid.
|
|
72
|
-
*/
|
|
73
|
-
export async function exchangeAvailablePublicKeyJwt(
|
|
74
|
-
orgId: string,
|
|
75
|
-
apiUrl: string = DEFAULT_API_URL,
|
|
76
|
-
preferredPrivateKeyPath?: string
|
|
77
|
-
): Promise<string> {
|
|
78
|
-
const defaultPath = getDefaultPrivateKeyPath();
|
|
79
|
-
const candidates = Array.from(
|
|
80
|
-
new Set([preferredPrivateKeyPath, defaultPath].filter((value): value is string => Boolean(value)))
|
|
81
|
-
).filter((candidate) => keyPairExists(candidate));
|
|
82
|
-
if (candidates.length === 0) throw new Error("CLI identity is unavailable");
|
|
83
|
-
|
|
84
|
-
let lastError: unknown;
|
|
85
|
-
for (const candidate of candidates) {
|
|
86
|
-
try {
|
|
87
|
-
return await exchangePublicKeyJwt(orgId, apiUrl, candidate);
|
|
88
|
-
} catch (error) {
|
|
89
|
-
lastError = error;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
throw lastError;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export async function authenticateWithKey(
|
|
96
|
-
orgId: string,
|
|
97
|
-
apiUrl: string = DEFAULT_API_URL,
|
|
98
|
-
privateKeyPath?: string
|
|
99
|
-
): Promise<boolean> {
|
|
100
|
-
if (!keyPairExists(privateKeyPath) && !keyPairExists()) return false;
|
|
101
|
-
|
|
102
|
-
try {
|
|
103
|
-
storeJwt(await exchangeAvailablePublicKeyJwt(orgId, apiUrl, privateKeyPath), apiUrl);
|
|
104
|
-
return true;
|
|
105
|
-
} catch (error: unknown) {
|
|
106
|
-
// The identity is not registered for this environment/org (or was revoked).
|
|
107
|
-
if (http.isHttpError(error) && (error.status === 401 || error.status === 404)) {
|
|
108
|
-
return false;
|
|
109
|
-
}
|
|
110
|
-
throw error;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/** Register an Ed25519 identity; the backend derives its scope from the source JWT. */
|
|
115
|
-
export async function registerPublicKey(
|
|
116
|
-
jwt: string,
|
|
117
|
-
publicKeyBase64: string,
|
|
118
|
-
apiUrl: string = DEFAULT_API_URL
|
|
119
|
-
): Promise<void> {
|
|
120
|
-
const rawPublicKey = Buffer.from(publicKeyBase64, "base64");
|
|
121
|
-
if (rawPublicKey.length !== 32 || rawPublicKey.toString("base64") !== publicKeyBase64) {
|
|
122
|
-
throw new Error("CLI authentication requires a 32-byte Ed25519 public key");
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
await http.post(
|
|
126
|
-
`${apiUrl}/api/public-keys/register`,
|
|
127
|
-
{
|
|
128
|
-
publicKey: publicKeyBase64,
|
|
129
|
-
label: os.hostname(),
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
headers: {
|
|
133
|
-
Authorization: `Bearer ${jwt}`,
|
|
134
|
-
"User-Agent": getCliUserAgent(),
|
|
135
|
-
},
|
|
136
|
-
}
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
export function storeJwt(jwt: string, apiUrl: string = DEFAULT_API_URL): void {
|
|
141
|
-
storeJwtForApi(jwt, apiUrl);
|
|
142
|
-
}
|