@tyvm/knowhow 0.0.159 → 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 +1 -1
- package/ts_build/package.json +1 -1
- 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
|
@@ -1,669 +0,0 @@
|
|
|
1
|
-
import * as fs from "fs";
|
|
2
|
-
import * as path from "path";
|
|
3
|
-
import { exec, spawn } from "child_process";
|
|
4
|
-
import { promisify } from "util";
|
|
5
|
-
import { fileExists, readFile, mkdir } from "../utils";
|
|
6
|
-
import { AIClient } from "../clients";
|
|
7
|
-
import { Models } from "../types";
|
|
8
|
-
|
|
9
|
-
const execPromise = promisify(exec);
|
|
10
|
-
|
|
11
|
-
async function execAsync(command: string): Promise<string> {
|
|
12
|
-
const { stdout, stderr } = await execPromise(command);
|
|
13
|
-
return stdout + stderr;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface TranscriptChunk {
|
|
17
|
-
chunkPath: string;
|
|
18
|
-
text: string;
|
|
19
|
-
usd_cost: number;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface KeyframeInfo {
|
|
23
|
-
path: string;
|
|
24
|
-
description: string;
|
|
25
|
-
timestamp: number;
|
|
26
|
-
usd_cost?: number;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Options for processing a full video (transcription + keyframes).
|
|
31
|
-
* Prefer passing this object over positional args so new options can be
|
|
32
|
-
* added without changing call sites.
|
|
33
|
-
*/
|
|
34
|
-
export interface ProcessVideoOptions {
|
|
35
|
-
/** Reuse a previously cached transcript/keyframes if present. Default true. */
|
|
36
|
-
reusePreviousTranscript?: boolean;
|
|
37
|
-
/** Audio transcription chunk length in seconds. Default 30. */
|
|
38
|
-
chunkTime?: number;
|
|
39
|
-
/** Progress callback (0..1) fired during ffmpeg audio chunking. */
|
|
40
|
-
onChunkingProgress?: (fraction: number) => void;
|
|
41
|
-
/**
|
|
42
|
-
* Seconds between sampled keyframes. When omitted, an adaptive interval is
|
|
43
|
-
* computed from the video duration (clamped 0.5s..30s), so short videos get
|
|
44
|
-
* a much denser set of frames (down to 500ms).
|
|
45
|
-
*/
|
|
46
|
-
keyframeInterval?: number;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* MediaProcessorService handles audio/video processing using:
|
|
51
|
-
* - ffmpeg (system tool) for chunking audio/video
|
|
52
|
-
* - OpenAI Whisper API for transcription
|
|
53
|
-
*
|
|
54
|
-
* This is part of the core services because microphone recording and
|
|
55
|
-
* audio-to-text transcription are base CLI features. The DownloaderService
|
|
56
|
-
* (in @tyvm/knowhow-module-video-downloader) uses this service for the
|
|
57
|
-
* audio/video processing steps after downloading with ytdl.
|
|
58
|
-
*/
|
|
59
|
-
export class MediaProcessorService {
|
|
60
|
-
constructor(private clients: AIClient) {}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Split an audio/video file into fixed-length mp3 chunks using ffmpeg.
|
|
64
|
-
*/
|
|
65
|
-
public async chunk(
|
|
66
|
-
filePath: string,
|
|
67
|
-
outputDir: string,
|
|
68
|
-
CHUNK_LENGTH_SECONDS = 30,
|
|
69
|
-
reuseExistingChunks = true,
|
|
70
|
-
onProgress?: (progressFraction: number) => void
|
|
71
|
-
): Promise<string[]> {
|
|
72
|
-
const parsed = path.parse(filePath);
|
|
73
|
-
const fileName = parsed.name;
|
|
74
|
-
const outputDirPath = path.join(outputDir, `${fileName}/chunks`);
|
|
75
|
-
await fs.promises.mkdir(outputDirPath, { recursive: true });
|
|
76
|
-
const doneFilePath = path.join(outputDirPath, ".chunking_done");
|
|
77
|
-
|
|
78
|
-
const doneFileExists = await fileExists(doneFilePath);
|
|
79
|
-
const existingFolderFiles = await fs.promises.readdir(outputDirPath);
|
|
80
|
-
const existingChunkNames = existingFolderFiles.filter(
|
|
81
|
-
(f) => f.includes("chunk") && f.endsWith(".mp3")
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
if (existingChunkNames.length > 0 && doneFileExists) {
|
|
85
|
-
if (reuseExistingChunks) {
|
|
86
|
-
console.log("Chunks already exist, skipping");
|
|
87
|
-
return existingChunkNames.map((chunkName) =>
|
|
88
|
-
path.join(outputDirPath, chunkName)
|
|
89
|
-
);
|
|
90
|
-
} else {
|
|
91
|
-
for (const file of existingFolderFiles) {
|
|
92
|
-
fs.rmSync(path.join(outputDirPath, file), { recursive: true });
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Use faster encoding settings:
|
|
98
|
-
// - mono audio (-ac 1): halves encoding work, Whisper handles mono fine
|
|
99
|
-
// - low bitrate (-b:a 32k): sufficient for speech, much faster encode + smaller files
|
|
100
|
-
// - fast preset not available for mp3 encoder, but limiting bitrate helps
|
|
101
|
-
// - -threads 0: use all available CPU threads for faster processing
|
|
102
|
-
// If the input is already an mp3, copy the audio stream to avoid re-encoding
|
|
103
|
-
const inputExt = path.extname(filePath).toLowerCase().replace('.', '');
|
|
104
|
-
const isAlreadyMp3 = inputExt === 'mp3';
|
|
105
|
-
const audioCodecArgs = isAlreadyMp3
|
|
106
|
-
? '-acodec copy'
|
|
107
|
-
: '-acodec libmp3lame -ac 1 -b:a 32k -threads 0';
|
|
108
|
-
|
|
109
|
-
// Use -progress pipe:1 to get real-time progress from ffmpeg
|
|
110
|
-
// We need the total duration first to calculate fraction
|
|
111
|
-
await new Promise<void>((resolve, reject) => {
|
|
112
|
-
// Get total duration via ffprobe first
|
|
113
|
-
let totalDurationSeconds = 0;
|
|
114
|
-
exec(
|
|
115
|
-
`ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "${filePath}"`,
|
|
116
|
-
(err, stdout) => {
|
|
117
|
-
if (!err && stdout.trim()) {
|
|
118
|
-
totalDurationSeconds = parseFloat(stdout.trim()) || 0;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Now run ffmpeg with progress reporting
|
|
122
|
-
const args = [
|
|
123
|
-
'-i', filePath,
|
|
124
|
-
'-f', 'segment',
|
|
125
|
-
'-segment_time', String(CHUNK_LENGTH_SECONDS),
|
|
126
|
-
'-map', '0:a:0',
|
|
127
|
-
...audioCodecArgs.split(' '),
|
|
128
|
-
'-vn',
|
|
129
|
-
...(onProgress ? ['-progress', 'pipe:1'] : []),
|
|
130
|
-
`${outputDirPath}/chunk%04d.mp3`,
|
|
131
|
-
];
|
|
132
|
-
|
|
133
|
-
const proc = spawn('ffmpeg', args);
|
|
134
|
-
|
|
135
|
-
let stdoutBuf = '';
|
|
136
|
-
proc.stdout?.on('data', (data: Buffer) => {
|
|
137
|
-
stdoutBuf += data.toString();
|
|
138
|
-
if (onProgress && totalDurationSeconds > 0) {
|
|
139
|
-
// ffmpeg -progress outputs key=value lines; look for out_time_ms
|
|
140
|
-
const match = stdoutBuf.match(/out_time_ms=(\d+)/g);
|
|
141
|
-
if (match) {
|
|
142
|
-
const last = match[match.length - 1];
|
|
143
|
-
const ms = parseInt(last.split('=')[1], 10);
|
|
144
|
-
const fraction = Math.min(ms / 1000 / totalDurationSeconds, 1);
|
|
145
|
-
onProgress(fraction);
|
|
146
|
-
// Keep only tail to avoid unbounded buffer growth
|
|
147
|
-
stdoutBuf = stdoutBuf.slice(-500);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
proc.on('close', (code) => {
|
|
153
|
-
if (code === 0) resolve();
|
|
154
|
-
else reject(new Error(`ffmpeg exited with code ${code}`));
|
|
155
|
-
});
|
|
156
|
-
proc.on('error', reject);
|
|
157
|
-
}
|
|
158
|
-
);
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
await fs.promises.writeFile(doneFilePath, "done");
|
|
162
|
-
|
|
163
|
-
const folderFiles = await fs.promises.readdir(outputDirPath);
|
|
164
|
-
const chunkNames = folderFiles.filter(
|
|
165
|
-
(f) => f.includes("chunk") && f.endsWith(".mp3")
|
|
166
|
-
);
|
|
167
|
-
console.log("Chunked into", chunkNames.length, "chunks");
|
|
168
|
-
return chunkNames.map((chunkName) => path.join(outputDirPath, chunkName));
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Stream transcription of audio chunks using Whisper.
|
|
173
|
-
*/
|
|
174
|
-
public async *streamTranscription(
|
|
175
|
-
files: string[],
|
|
176
|
-
outputPath: string,
|
|
177
|
-
reusePreviousTranscript = true
|
|
178
|
-
): AsyncGenerator<TranscriptChunk> {
|
|
179
|
-
const exists = await fileExists(outputPath);
|
|
180
|
-
if (exists && reusePreviousTranscript) {
|
|
181
|
-
console.log("Transcription already exists, using cached data");
|
|
182
|
-
const contents = await readFile(outputPath);
|
|
183
|
-
const data = JSON.parse(contents.toString()) as TranscriptChunk[];
|
|
184
|
-
for (const item of data) yield item;
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const allTranscripts: TranscriptChunk[] = [];
|
|
189
|
-
for (const file of files) {
|
|
190
|
-
const chunkName = path.parse(file).name;
|
|
191
|
-
const chunkTranscriptPath = path.join(
|
|
192
|
-
path.dirname(outputPath),
|
|
193
|
-
`/chunks/${chunkName}.txt`
|
|
194
|
-
);
|
|
195
|
-
const chunkExists = await fileExists(chunkTranscriptPath);
|
|
196
|
-
|
|
197
|
-
if (chunkExists && reusePreviousTranscript) {
|
|
198
|
-
const contents = await readFile(chunkTranscriptPath);
|
|
199
|
-
const cached: TranscriptChunk = {
|
|
200
|
-
chunkPath: chunkTranscriptPath,
|
|
201
|
-
text: contents.toString(),
|
|
202
|
-
usd_cost: 0,
|
|
203
|
-
};
|
|
204
|
-
yield cached;
|
|
205
|
-
allTranscripts.push(cached);
|
|
206
|
-
continue;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
console.log("Transcribing", file);
|
|
210
|
-
const fileBuffer = fs.readFileSync(file);
|
|
211
|
-
const transcript = await this.clients
|
|
212
|
-
.createAudioTranscription("openai", {
|
|
213
|
-
file: fileBuffer,
|
|
214
|
-
fileName: path.basename(file),
|
|
215
|
-
model: "whisper-1",
|
|
216
|
-
})
|
|
217
|
-
.catch((e: any) => {
|
|
218
|
-
console.error("Error transcribing", file, e);
|
|
219
|
-
return { text: "" };
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
await mkdir(path.dirname(chunkTranscriptPath), { recursive: true });
|
|
223
|
-
await fs.promises.writeFile(chunkTranscriptPath, transcript.text);
|
|
224
|
-
|
|
225
|
-
const data: TranscriptChunk = {
|
|
226
|
-
chunkPath: chunkTranscriptPath,
|
|
227
|
-
text: transcript.text,
|
|
228
|
-
usd_cost: 30 * 0.0001,
|
|
229
|
-
};
|
|
230
|
-
yield data;
|
|
231
|
-
allTranscripts.push(data);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
fs.writeFileSync(outputPath, JSON.stringify(allTranscripts, null, 2));
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
/**
|
|
238
|
-
* Transcribe all audio chunks and return the text strings.
|
|
239
|
-
*/
|
|
240
|
-
public async transcribeChunks(
|
|
241
|
-
files: string[],
|
|
242
|
-
outputPath: string,
|
|
243
|
-
reusePreviousTranscript = true
|
|
244
|
-
): Promise<string[]> {
|
|
245
|
-
const exists = await fileExists(outputPath);
|
|
246
|
-
if (exists && reusePreviousTranscript) {
|
|
247
|
-
const contents = await readFile(outputPath);
|
|
248
|
-
return JSON.parse(contents.toString()) as string[];
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
const fullText: string[] = [];
|
|
252
|
-
for await (const { text } of this.streamTranscription(
|
|
253
|
-
files,
|
|
254
|
-
outputPath,
|
|
255
|
-
reusePreviousTranscript
|
|
256
|
-
)) {
|
|
257
|
-
fullText.push(text);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
await fs.promises.writeFile(outputPath, JSON.stringify(fullText));
|
|
261
|
-
return fullText;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Process an audio/video file: chunk it with ffmpeg, then transcribe each chunk.
|
|
266
|
-
* Returns an array of transcript strings (one per chunk).
|
|
267
|
-
*/
|
|
268
|
-
public async processAudio(
|
|
269
|
-
filePath: string,
|
|
270
|
-
reusePreviousTranscript = true,
|
|
271
|
-
chunkTime = 30
|
|
272
|
-
): Promise<string[]> {
|
|
273
|
-
const parsed = path.parse(filePath);
|
|
274
|
-
const outputPath = `${parsed.dir}/${parsed.name}/transcript.json`;
|
|
275
|
-
|
|
276
|
-
const exists = await fileExists(outputPath);
|
|
277
|
-
if (exists && reusePreviousTranscript) {
|
|
278
|
-
const fileContent = (await readFile(outputPath, "utf8")) as string;
|
|
279
|
-
return outputPath.endsWith("txt")
|
|
280
|
-
? fileContent.split("\n")
|
|
281
|
-
: JSON.parse(fileContent);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
const chunks = await this.chunk(
|
|
285
|
-
filePath,
|
|
286
|
-
parsed.dir,
|
|
287
|
-
chunkTime,
|
|
288
|
-
reusePreviousTranscript
|
|
289
|
-
);
|
|
290
|
-
return this.transcribeChunks(chunks, outputPath, reusePreviousTranscript);
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* Extract keyframes from a video file using ffmpeg, then describe each with vision AI.
|
|
295
|
-
*
|
|
296
|
-
* @param filePath - Path to the input video file.
|
|
297
|
-
* @param videoJsonPath - Path where the resulting keyframe JSON data will be saved/cached.
|
|
298
|
-
* @param reusePreviousKeyframes - Whether to reuse previously extracted keyframes (default: true).
|
|
299
|
-
* @param interval - How often (in seconds) to sample a frame from the video (default: 10).
|
|
300
|
-
* Lower values produce more frames; higher values produce fewer.
|
|
301
|
-
*/
|
|
302
|
-
public async *streamKeyFrameExtraction(
|
|
303
|
-
filePath: string,
|
|
304
|
-
videoJsonPath: string,
|
|
305
|
-
reusePreviousKeyframes = true,
|
|
306
|
-
interval?: number
|
|
307
|
-
): AsyncGenerator<KeyframeInfo> {
|
|
308
|
-
if (interval === undefined) {
|
|
309
|
-
const duration = await this.getMediaDuration(filePath);
|
|
310
|
-
const rawInterval = (duration / 3600) * 30;
|
|
311
|
-
interval = Math.min(30, Math.max(0.5, rawInterval));
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
if (reusePreviousKeyframes && fs.existsSync(videoJsonPath)) {
|
|
315
|
-
const contents = await readFile(videoJsonPath);
|
|
316
|
-
const data = JSON.parse(contents.toString()) as KeyframeInfo[];
|
|
317
|
-
for (const keyframe of data) yield { ...keyframe, usd_cost: 0 };
|
|
318
|
-
return;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
const outputDir = path.dirname(videoJsonPath);
|
|
322
|
-
const keyframesDir = path.join(outputDir, "keyframes");
|
|
323
|
-
await fs.promises.mkdir(keyframesDir, { recursive: true });
|
|
324
|
-
|
|
325
|
-
const command = `ffmpeg -i "${filePath}" -vf "fps=1/${interval},scale=640:-1" "${keyframesDir}/frame%04d.jpg"`;
|
|
326
|
-
await execAsync(command);
|
|
327
|
-
|
|
328
|
-
const keyframes = await fs.promises.readdir(keyframesDir);
|
|
329
|
-
const allKeyframes: KeyframeInfo[] = [];
|
|
330
|
-
|
|
331
|
-
for (const keyframe of keyframes) {
|
|
332
|
-
const keyframePath = path.join(keyframesDir, keyframe);
|
|
333
|
-
const keyframeName = path.parse(keyframe).name;
|
|
334
|
-
const keyframeDescriptionPath = path.join(
|
|
335
|
-
keyframesDir,
|
|
336
|
-
`${keyframeName}.json`
|
|
337
|
-
);
|
|
338
|
-
const descriptionExists = await fileExists(keyframeDescriptionPath);
|
|
339
|
-
|
|
340
|
-
if (descriptionExists && reusePreviousKeyframes) {
|
|
341
|
-
const cached = await readFile(keyframeDescriptionPath);
|
|
342
|
-
const cachedJson = JSON.parse(cached.toString()) as KeyframeInfo;
|
|
343
|
-
yield { ...cachedJson, usd_cost: 0 };
|
|
344
|
-
allKeyframes.push(cachedJson);
|
|
345
|
-
continue;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
const description = await this.describeKeyframe(keyframePath);
|
|
349
|
-
const frameNumber = parseInt(keyframe.match(/\d+/)?.[0] ?? "0", 10);
|
|
350
|
-
const keyframeJson: KeyframeInfo = {
|
|
351
|
-
path: keyframePath,
|
|
352
|
-
description: description.choices[0].message.content,
|
|
353
|
-
timestamp: frameNumber * interval,
|
|
354
|
-
usd_cost: description.usd_cost,
|
|
355
|
-
};
|
|
356
|
-
await fs.promises.writeFile(
|
|
357
|
-
keyframeDescriptionPath,
|
|
358
|
-
JSON.stringify(keyframeJson, null, 2)
|
|
359
|
-
);
|
|
360
|
-
yield keyframeJson;
|
|
361
|
-
allKeyframes.push(keyframeJson);
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
await fs.promises.writeFile(
|
|
365
|
-
videoJsonPath,
|
|
366
|
-
JSON.stringify(allKeyframes, null, 2)
|
|
367
|
-
);
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
/**
|
|
371
|
-
* Extract keyframes from a video file and return them as an array.
|
|
372
|
-
*
|
|
373
|
-
* @param filePath - Path to the input video file.
|
|
374
|
-
* @param outputPath - Path where the resulting keyframe JSON data will be saved/cached.
|
|
375
|
-
* @param reusePreviousKeyframes - Whether to reuse previously extracted keyframes (default: true).
|
|
376
|
-
* @param interval - How often (in seconds) to sample a frame from the video (default: 10).
|
|
377
|
-
* Lower values produce more frames; higher values produce fewer.
|
|
378
|
-
*/
|
|
379
|
-
|
|
380
|
-
public async extractKeyframes(
|
|
381
|
-
filePath: string,
|
|
382
|
-
outputPath: string,
|
|
383
|
-
reusePreviousKeyframes = true,
|
|
384
|
-
interval?: number
|
|
385
|
-
): Promise<KeyframeInfo[]> {
|
|
386
|
-
const keyframes: KeyframeInfo[] = [];
|
|
387
|
-
for await (const keyframe of this.streamKeyFrameExtraction(
|
|
388
|
-
filePath,
|
|
389
|
-
outputPath,
|
|
390
|
-
reusePreviousKeyframes,
|
|
391
|
-
interval
|
|
392
|
-
)) {
|
|
393
|
-
keyframes.push(keyframe);
|
|
394
|
-
}
|
|
395
|
-
await fs.promises.writeFile(outputPath, JSON.stringify(keyframes, null, 2));
|
|
396
|
-
return keyframes;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
/**
|
|
400
|
-
* Extract (and optionally describe) keyframes for a specific time slice of a
|
|
401
|
-
* video, e.g. "just the first minute". This is useful for focusing a denser
|
|
402
|
-
* frame sample on a short region without reprocessing the whole video.
|
|
403
|
-
*
|
|
404
|
-
* @param filePath Path to the input video file.
|
|
405
|
-
* @param startSec Start of the slice in seconds (inclusive).
|
|
406
|
-
* @param endSec End of the slice in seconds (exclusive).
|
|
407
|
-
* @param options.interval Seconds between sampled frames within the slice.
|
|
408
|
-
* Defaults to 1s. Clamped to a minimum of 0.5s.
|
|
409
|
-
* @param options.describe Whether to run the vision model on each frame.
|
|
410
|
-
* Defaults to true. Set false to get frames only.
|
|
411
|
-
* @param options.outputDir Directory to write extracted frames into.
|
|
412
|
-
* Defaults to <dir>/<name>/slices/<start>-<end>.
|
|
413
|
-
*/
|
|
414
|
-
public async *streamKeyFrameExtractionForRange(
|
|
415
|
-
filePath: string,
|
|
416
|
-
startSec: number,
|
|
417
|
-
endSec: number,
|
|
418
|
-
options: {
|
|
419
|
-
interval?: number;
|
|
420
|
-
describe?: boolean;
|
|
421
|
-
outputDir?: string;
|
|
422
|
-
} = {}
|
|
423
|
-
): AsyncGenerator<KeyframeInfo> {
|
|
424
|
-
const interval = Math.max(0.5, options.interval ?? 1);
|
|
425
|
-
const describe = options.describe ?? true;
|
|
426
|
-
const parsed = path.parse(filePath);
|
|
427
|
-
const outputDir =
|
|
428
|
-
options.outputDir ??
|
|
429
|
-
path.join(parsed.dir, parsed.name, "slices", `${startSec}-${endSec}`);
|
|
430
|
-
await fs.promises.mkdir(outputDir, { recursive: true });
|
|
431
|
-
|
|
432
|
-
const duration = Math.max(0, endSec - startSec);
|
|
433
|
-
// -ss before -i seeks quickly; -t limits to the slice length.
|
|
434
|
-
const command =
|
|
435
|
-
`ffmpeg -y -ss ${startSec} -t ${duration} -i "${filePath}" ` +
|
|
436
|
-
`-vf "fps=1/${interval},scale=640:-1" "${outputDir}/frame%04d.jpg"`;
|
|
437
|
-
await execAsync(command);
|
|
438
|
-
|
|
439
|
-
const frames = (await fs.promises.readdir(outputDir))
|
|
440
|
-
.filter((f) => f.endsWith(".jpg"))
|
|
441
|
-
.sort();
|
|
442
|
-
|
|
443
|
-
for (const frame of frames) {
|
|
444
|
-
const framePath = path.join(outputDir, frame);
|
|
445
|
-
const frameNumber = parseInt(frame.match(/\d+/)?.[0] ?? "0", 10);
|
|
446
|
-
// ffmpeg names frames starting at 1; map back to absolute video time.
|
|
447
|
-
const timestamp = startSec + (frameNumber - 1) * interval;
|
|
448
|
-
|
|
449
|
-
if (!describe) {
|
|
450
|
-
yield { path: framePath, description: "", timestamp, usd_cost: 0 };
|
|
451
|
-
continue;
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
const description = await this.describeKeyframe(framePath);
|
|
455
|
-
yield {
|
|
456
|
-
path: framePath,
|
|
457
|
-
description: description.choices[0].message.content,
|
|
458
|
-
timestamp,
|
|
459
|
-
usd_cost: description.usd_cost,
|
|
460
|
-
};
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
/**
|
|
465
|
-
* Extract an audio slice [startSec, endSec) from a media file into an mp3.
|
|
466
|
-
* Returns the path to the produced mp3, suitable for transcription or download.
|
|
467
|
-
*/
|
|
468
|
-
public async extractAudioSlice(
|
|
469
|
-
filePath: string,
|
|
470
|
-
startSec: number,
|
|
471
|
-
endSec: number,
|
|
472
|
-
outputPath?: string
|
|
473
|
-
): Promise<string> {
|
|
474
|
-
const parsed = path.parse(filePath);
|
|
475
|
-
const outPath =
|
|
476
|
-
outputPath ??
|
|
477
|
-
path.join(
|
|
478
|
-
parsed.dir,
|
|
479
|
-
parsed.name,
|
|
480
|
-
"slices",
|
|
481
|
-
`audio-${startSec}-${endSec}.mp3`
|
|
482
|
-
);
|
|
483
|
-
await fs.promises.mkdir(path.dirname(outPath), { recursive: true });
|
|
484
|
-
|
|
485
|
-
const duration = Math.max(0, endSec - startSec);
|
|
486
|
-
const command =
|
|
487
|
-
`ffmpeg -y -ss ${startSec} -t ${duration} -i "${filePath}" ` +
|
|
488
|
-
`-vn -acodec libmp3lame -ac 1 -b:a 32k "${outPath}"`;
|
|
489
|
-
await execAsync(command);
|
|
490
|
-
return outPath;
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
/**
|
|
494
|
-
* Get the duration of a media file in seconds using ffprobe.
|
|
495
|
-
*/
|
|
496
|
-
public async getMediaDuration(filePath: string): Promise<number> {
|
|
497
|
-
const output = await execAsync(
|
|
498
|
-
`ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "${filePath}"`
|
|
499
|
-
);
|
|
500
|
-
return parseFloat(output.trim());
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
private async describeKeyframe(keyframePath: string) {
|
|
504
|
-
const question =
|
|
505
|
-
"Describe this image in detail, focusing on the main elements and actions visible.";
|
|
506
|
-
const base64 = await fs.promises.readFile(keyframePath, {
|
|
507
|
-
encoding: "base64",
|
|
508
|
-
});
|
|
509
|
-
const image = `data:image/jpeg;base64,${base64}`;
|
|
510
|
-
return this.clients.createCompletion("openai", {
|
|
511
|
-
model: Models.openai.GPT_4o,
|
|
512
|
-
max_tokens: 2500,
|
|
513
|
-
timeout: 20000,
|
|
514
|
-
messages: [
|
|
515
|
-
{
|
|
516
|
-
role: "user",
|
|
517
|
-
content: [
|
|
518
|
-
{ type: "text", text: question },
|
|
519
|
-
{ type: "image_url", image_url: { url: image } },
|
|
520
|
-
],
|
|
521
|
-
},
|
|
522
|
-
],
|
|
523
|
-
});
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
async *streamProcessVideo(
|
|
527
|
-
filePath: string,
|
|
528
|
-
reusePreviousTranscriptOrOptions: boolean | ProcessVideoOptions = true,
|
|
529
|
-
chunkTime = 30,
|
|
530
|
-
onChunkingProgress?: (fraction: number) => void,
|
|
531
|
-
keyframeInterval?: number
|
|
532
|
-
) {
|
|
533
|
-
// Support both the legacy positional signature and a new options object
|
|
534
|
-
// passed as the second argument. Prefer the options object going forward.
|
|
535
|
-
const opts: Required<Pick<ProcessVideoOptions, "reusePreviousTranscript" | "chunkTime">> &
|
|
536
|
-
ProcessVideoOptions =
|
|
537
|
-
typeof reusePreviousTranscriptOrOptions === "object"
|
|
538
|
-
? {
|
|
539
|
-
reusePreviousTranscript:
|
|
540
|
-
reusePreviousTranscriptOrOptions.reusePreviousTranscript ?? true,
|
|
541
|
-
chunkTime: reusePreviousTranscriptOrOptions.chunkTime ?? 30,
|
|
542
|
-
onChunkingProgress:
|
|
543
|
-
reusePreviousTranscriptOrOptions.onChunkingProgress,
|
|
544
|
-
keyframeInterval:
|
|
545
|
-
reusePreviousTranscriptOrOptions.keyframeInterval,
|
|
546
|
-
}
|
|
547
|
-
: {
|
|
548
|
-
reusePreviousTranscript: reusePreviousTranscriptOrOptions,
|
|
549
|
-
chunkTime,
|
|
550
|
-
onChunkingProgress,
|
|
551
|
-
keyframeInterval,
|
|
552
|
-
};
|
|
553
|
-
|
|
554
|
-
const parsed = path.parse(filePath);
|
|
555
|
-
const videoJson = `${parsed.dir}/${parsed.name}/video.json`;
|
|
556
|
-
|
|
557
|
-
console.log("Processing audio...");
|
|
558
|
-
const transcriptions = this.streamProcessAudio(
|
|
559
|
-
filePath,
|
|
560
|
-
opts.reusePreviousTranscript,
|
|
561
|
-
opts.chunkTime,
|
|
562
|
-
opts.onChunkingProgress
|
|
563
|
-
);
|
|
564
|
-
|
|
565
|
-
console.log("Extracting keyframes...");
|
|
566
|
-
// When keyframeInterval is undefined, streamKeyFrameExtraction computes an
|
|
567
|
-
// adaptive interval based on video duration, clamped between 0.5s and 30s.
|
|
568
|
-
// This gives short videos a much denser set of frames (down to 500ms) while
|
|
569
|
-
// keeping long videos at a reasonable frame count. Previously this passed
|
|
570
|
-
// chunkTime (30s), which meant every video only got 1 frame per 30s.
|
|
571
|
-
const videoAnalysis = this.streamKeyFrameExtraction(
|
|
572
|
-
filePath,
|
|
573
|
-
videoJson,
|
|
574
|
-
opts.reusePreviousTranscript,
|
|
575
|
-
opts.keyframeInterval
|
|
576
|
-
);
|
|
577
|
-
|
|
578
|
-
// Frames and transcript chunks can arrive at different cadences: with an
|
|
579
|
-
// adaptive keyframe interval a short video may have many more frames than
|
|
580
|
-
// 30s transcript chunks. Rather than a 1:1 positional zip (which would
|
|
581
|
-
// strand most frames with "[missing transcript]" and drop transcripts),
|
|
582
|
-
// we map each frame to the transcript chunk that covers its timestamp.
|
|
583
|
-
// Transcript chunk N covers [N*chunkTime, (N+1)*chunkTime).
|
|
584
|
-
const transcriptBuffer: TranscriptChunk[] = [];
|
|
585
|
-
const missingTranscript: TranscriptChunk = {
|
|
586
|
-
chunkPath: "",
|
|
587
|
-
text: "[missing transcript]",
|
|
588
|
-
usd_cost: 0,
|
|
589
|
-
};
|
|
590
|
-
|
|
591
|
-
for await (const frame of videoAnalysis) {
|
|
592
|
-
const chunkIndex = Math.floor((frame.timestamp || 0) / opts.chunkTime);
|
|
593
|
-
|
|
594
|
-
// Pull transcript chunks until we have one that covers this frame's window.
|
|
595
|
-
while (transcriptBuffer.length <= chunkIndex) {
|
|
596
|
-
const next = await transcriptions.next();
|
|
597
|
-
if (next.done) break;
|
|
598
|
-
transcriptBuffer.push(next.value as TranscriptChunk);
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
const transcription = transcriptBuffer[chunkIndex] || missingTranscript;
|
|
602
|
-
yield { frame, transcription };
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
// Drain any remaining transcript chunks (e.g. audio longer than the last
|
|
606
|
-
// frame's window) so their content/cost isn't silently dropped.
|
|
607
|
-
let remaining = await transcriptions.next();
|
|
608
|
-
while (!remaining.done) {
|
|
609
|
-
yield {
|
|
610
|
-
frame: {
|
|
611
|
-
path: "",
|
|
612
|
-
description: "",
|
|
613
|
-
timestamp: transcriptBuffer.length * opts.chunkTime,
|
|
614
|
-
usd_cost: 0,
|
|
615
|
-
},
|
|
616
|
-
transcription: remaining.value as TranscriptChunk,
|
|
617
|
-
};
|
|
618
|
-
transcriptBuffer.push(remaining.value as TranscriptChunk);
|
|
619
|
-
remaining = await transcriptions.next();
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
async *streamProcessAudio(
|
|
624
|
-
filePath: string,
|
|
625
|
-
reusePreviousTranscript = true,
|
|
626
|
-
chunkTime = 30,
|
|
627
|
-
onChunkingProgress?: (fraction: number) => void
|
|
628
|
-
): AsyncGenerator<TranscriptChunk> {
|
|
629
|
-
const parsed = path.parse(filePath);
|
|
630
|
-
const outputPath = `${parsed.dir}/${parsed.name}/transcript.json`;
|
|
631
|
-
|
|
632
|
-
// Skip chunking if the full output exists
|
|
633
|
-
const exists = await fileExists(outputPath);
|
|
634
|
-
if (exists && reusePreviousTranscript) {
|
|
635
|
-
console.log(
|
|
636
|
-
`Transcription ${outputPath} already exists, using cached data`
|
|
637
|
-
);
|
|
638
|
-
const fileContent = await readFile(outputPath, "utf8");
|
|
639
|
-
const lines = outputPath.endsWith("txt")
|
|
640
|
-
? fileContent.split("\n")
|
|
641
|
-
: JSON.parse(fileContent);
|
|
642
|
-
|
|
643
|
-
for (const line of lines) {
|
|
644
|
-
if (typeof line === "string") {
|
|
645
|
-
yield { chunkPath: "", text: line, usd_cost: 0 };
|
|
646
|
-
} else {
|
|
647
|
-
yield line as TranscriptChunk;
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
return;
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
const chunks = await this.chunk(
|
|
654
|
-
filePath,
|
|
655
|
-
parsed.dir,
|
|
656
|
-
chunkTime,
|
|
657
|
-
reusePreviousTranscript,
|
|
658
|
-
onChunkingProgress
|
|
659
|
-
);
|
|
660
|
-
|
|
661
|
-
for await (const chunk of this.streamTranscription(
|
|
662
|
-
chunks,
|
|
663
|
-
outputPath,
|
|
664
|
-
reusePreviousTranscript
|
|
665
|
-
)) {
|
|
666
|
-
yield chunk;
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
}
|