deepseek-coder-cli 1.0.0
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/LICENSE +21 -0
- package/README.md +422 -0
- package/agents/agi-code.rules.json +87 -0
- package/agents/general.rules.json +171 -0
- package/dist/bin/cliMode.d.ts +8 -0
- package/dist/bin/cliMode.d.ts.map +1 -0
- package/dist/bin/cliMode.js +20 -0
- package/dist/bin/cliMode.js.map +1 -0
- package/dist/bin/deepseek.d.ts +16 -0
- package/dist/bin/deepseek.d.ts.map +1 -0
- package/dist/bin/deepseek.js +737 -0
- package/dist/bin/deepseek.js.map +1 -0
- package/dist/bin/erosolar.d.ts +7 -0
- package/dist/bin/erosolar.d.ts.map +1 -0
- package/dist/bin/erosolar.js +7 -0
- package/dist/bin/erosolar.js.map +1 -0
- package/dist/bin/selfTest.d.ts +14 -0
- package/dist/bin/selfTest.d.ts.map +1 -0
- package/dist/bin/selfTest.js +304 -0
- package/dist/bin/selfTest.js.map +1 -0
- package/dist/capabilities/appleSecurityCapability.d.ts +57 -0
- package/dist/capabilities/appleSecurityCapability.d.ts.map +1 -0
- package/dist/capabilities/appleSecurityCapability.js +197 -0
- package/dist/capabilities/appleSecurityCapability.js.map +1 -0
- package/dist/capabilities/authorizedSecurityCapability.d.ts +17 -0
- package/dist/capabilities/authorizedSecurityCapability.d.ts.map +1 -0
- package/dist/capabilities/authorizedSecurityCapability.js +333 -0
- package/dist/capabilities/authorizedSecurityCapability.js.map +1 -0
- package/dist/capabilities/autoEnhancementCapability.d.ts +98 -0
- package/dist/capabilities/autoEnhancementCapability.d.ts.map +1 -0
- package/dist/capabilities/autoEnhancementCapability.js +455 -0
- package/dist/capabilities/autoEnhancementCapability.js.map +1 -0
- package/dist/capabilities/baseCapability.d.ts +72 -0
- package/dist/capabilities/baseCapability.d.ts.map +1 -0
- package/dist/capabilities/baseCapability.js +183 -0
- package/dist/capabilities/baseCapability.js.map +1 -0
- package/dist/capabilities/bashCapability.d.ts +13 -0
- package/dist/capabilities/bashCapability.d.ts.map +1 -0
- package/dist/capabilities/bashCapability.js +24 -0
- package/dist/capabilities/bashCapability.js.map +1 -0
- package/dist/capabilities/biocognitiveWarfare.d.ts +136 -0
- package/dist/capabilities/biocognitiveWarfare.d.ts.map +1 -0
- package/dist/capabilities/biocognitiveWarfare.js +603 -0
- package/dist/capabilities/biocognitiveWarfare.js.map +1 -0
- package/dist/capabilities/chineseCnoIntegration.d.ts +60 -0
- package/dist/capabilities/chineseCnoIntegration.d.ts.map +1 -0
- package/dist/capabilities/chineseCnoIntegration.js +253 -0
- package/dist/capabilities/chineseCnoIntegration.js.map +1 -0
- package/dist/capabilities/cnoCapability.d.ts +110 -0
- package/dist/capabilities/cnoCapability.d.ts.map +1 -0
- package/dist/capabilities/cnoCapability.js +785 -0
- package/dist/capabilities/cnoCapability.js.map +1 -0
- package/dist/capabilities/editCapability.d.ts +17 -0
- package/dist/capabilities/editCapability.d.ts.map +1 -0
- package/dist/capabilities/editCapability.js +27 -0
- package/dist/capabilities/editCapability.js.map +1 -0
- package/dist/capabilities/eliteCryptoMilitaryCapability.d.ts +99 -0
- package/dist/capabilities/eliteCryptoMilitaryCapability.d.ts.map +1 -0
- package/dist/capabilities/eliteCryptoMilitaryCapability.js +618 -0
- package/dist/capabilities/eliteCryptoMilitaryCapability.js.map +1 -0
- package/dist/capabilities/enhancedGitCapability.d.ts +7 -0
- package/dist/capabilities/enhancedGitCapability.d.ts.map +1 -0
- package/dist/capabilities/enhancedGitCapability.js +220 -0
- package/dist/capabilities/enhancedGitCapability.js.map +1 -0
- package/dist/capabilities/filesystemCapability.d.ts +13 -0
- package/dist/capabilities/filesystemCapability.d.ts.map +1 -0
- package/dist/capabilities/filesystemCapability.js +24 -0
- package/dist/capabilities/filesystemCapability.js.map +1 -0
- package/dist/capabilities/gitHistoryCapability.d.ts +6 -0
- package/dist/capabilities/gitHistoryCapability.d.ts.map +1 -0
- package/dist/capabilities/gitHistoryCapability.js +160 -0
- package/dist/capabilities/gitHistoryCapability.js.map +1 -0
- package/dist/capabilities/index.d.ts +26 -0
- package/dist/capabilities/index.d.ts.map +1 -0
- package/dist/capabilities/index.js +26 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/capabilities/integratedUnifiedCapability.d.ts +105 -0
- package/dist/capabilities/integratedUnifiedCapability.d.ts.map +1 -0
- package/dist/capabilities/integratedUnifiedCapability.js +422 -0
- package/dist/capabilities/integratedUnifiedCapability.js.map +1 -0
- package/dist/capabilities/maxOffensiveUkraineCapability.d.ts +46 -0
- package/dist/capabilities/maxOffensiveUkraineCapability.d.ts.map +1 -0
- package/dist/capabilities/maxOffensiveUkraineCapability.js +725 -0
- package/dist/capabilities/maxOffensiveUkraineCapability.js.map +1 -0
- package/dist/capabilities/migrationUtilities.d.ts +128 -0
- package/dist/capabilities/migrationUtilities.d.ts.map +1 -0
- package/dist/capabilities/migrationUtilities.js +658 -0
- package/dist/capabilities/migrationUtilities.js.map +1 -0
- package/dist/capabilities/offensiveDestructionCapability.d.ts +98 -0
- package/dist/capabilities/offensiveDestructionCapability.d.ts.map +1 -0
- package/dist/capabilities/offensiveDestructionCapability.js +848 -0
- package/dist/capabilities/offensiveDestructionCapability.js.map +1 -0
- package/dist/capabilities/quantumSpaceWarfare.d.ts +108 -0
- package/dist/capabilities/quantumSpaceWarfare.d.ts.map +1 -0
- package/dist/capabilities/quantumSpaceWarfare.js +342 -0
- package/dist/capabilities/quantumSpaceWarfare.js.map +1 -0
- package/dist/capabilities/readmeIntegration.d.ts +161 -0
- package/dist/capabilities/readmeIntegration.d.ts.map +1 -0
- package/dist/capabilities/readmeIntegration.js +1034 -0
- package/dist/capabilities/readmeIntegration.js.map +1 -0
- package/dist/capabilities/searchCapability.d.ts +19 -0
- package/dist/capabilities/searchCapability.d.ts.map +1 -0
- package/dist/capabilities/searchCapability.js +29 -0
- package/dist/capabilities/searchCapability.js.map +1 -0
- package/dist/capabilities/selfUpdateSystem.d.ts +122 -0
- package/dist/capabilities/selfUpdateSystem.d.ts.map +1 -0
- package/dist/capabilities/selfUpdateSystem.js +725 -0
- package/dist/capabilities/selfUpdateSystem.js.map +1 -0
- package/dist/capabilities/sharedMilitaryInfrastructure.d.ts +89 -0
- package/dist/capabilities/sharedMilitaryInfrastructure.d.ts.map +1 -0
- package/dist/capabilities/sharedMilitaryInfrastructure.js +233 -0
- package/dist/capabilities/sharedMilitaryInfrastructure.js.map +1 -0
- package/dist/capabilities/simpleSecurityCapability.d.ts +36 -0
- package/dist/capabilities/simpleSecurityCapability.d.ts.map +1 -0
- package/dist/capabilities/simpleSecurityCapability.js +271 -0
- package/dist/capabilities/simpleSecurityCapability.js.map +1 -0
- package/dist/capabilities/toolManifest.d.ts +3 -0
- package/dist/capabilities/toolManifest.d.ts.map +1 -0
- package/dist/capabilities/toolManifest.js +163 -0
- package/dist/capabilities/toolManifest.js.map +1 -0
- package/dist/capabilities/toolRegistry.d.ts +25 -0
- package/dist/capabilities/toolRegistry.d.ts.map +1 -0
- package/dist/capabilities/toolRegistry.js +150 -0
- package/dist/capabilities/toolRegistry.js.map +1 -0
- package/dist/capabilities/ultimateChineseCno.d.ts +115 -0
- package/dist/capabilities/ultimateChineseCno.d.ts.map +1 -0
- package/dist/capabilities/ultimateChineseCno.js +516 -0
- package/dist/capabilities/ultimateChineseCno.js.map +1 -0
- package/dist/capabilities/ultimateIntegrationDemo.d.ts +54 -0
- package/dist/capabilities/ultimateIntegrationDemo.d.ts.map +1 -0
- package/dist/capabilities/ultimateIntegrationDemo.js +423 -0
- package/dist/capabilities/ultimateIntegrationDemo.js.map +1 -0
- package/dist/capabilities/unifiedMilitaryCapability.d.ts +63 -0
- package/dist/capabilities/unifiedMilitaryCapability.d.ts.map +1 -0
- package/dist/capabilities/unifiedMilitaryCapability.js +384 -0
- package/dist/capabilities/unifiedMilitaryCapability.js.map +1 -0
- package/dist/capabilities/universalCapabilityFramework.d.ts +352 -0
- package/dist/capabilities/universalCapabilityFramework.d.ts.map +1 -0
- package/dist/capabilities/universalCapabilityFramework.js +1056 -0
- package/dist/capabilities/universalCapabilityFramework.js.map +1 -0
- package/dist/capabilities/universalSecurityCapability.d.ts +46 -0
- package/dist/capabilities/universalSecurityCapability.d.ts.map +1 -0
- package/dist/capabilities/universalSecurityCapability.js +580 -0
- package/dist/capabilities/universalSecurityCapability.js.map +1 -0
- package/dist/capabilities/webCapability.d.ts +23 -0
- package/dist/capabilities/webCapability.d.ts.map +1 -0
- package/dist/capabilities/webCapability.js +33 -0
- package/dist/capabilities/webCapability.js.map +1 -0
- package/dist/capabilities/zeroDayDiscoveryCapability.d.ts +31 -0
- package/dist/capabilities/zeroDayDiscoveryCapability.d.ts.map +1 -0
- package/dist/capabilities/zeroDayDiscoveryCapability.js +183 -0
- package/dist/capabilities/zeroDayDiscoveryCapability.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +155 -0
- package/dist/config.js.map +1 -0
- package/dist/contracts/agent-profiles.schema.json +43 -0
- package/dist/contracts/agent-schemas.json +466 -0
- package/dist/contracts/models.schema.json +9 -0
- package/dist/contracts/module-schema.json +430 -0
- package/dist/contracts/schemas/agent-profile.schema.json +157 -0
- package/dist/contracts/schemas/agent-rules.schema.json +238 -0
- package/dist/contracts/schemas/agent-schemas.schema.json +528 -0
- package/dist/contracts/schemas/agent.schema.json +90 -0
- package/dist/contracts/schemas/tool-selection.schema.json +174 -0
- package/dist/contracts/tools.schema.json +82 -0
- package/dist/contracts/unified-schema.json +757 -0
- package/dist/contracts/v1/agent.d.ts +179 -0
- package/dist/contracts/v1/agent.d.ts.map +1 -0
- package/dist/contracts/v1/agent.js +8 -0
- package/dist/contracts/v1/agent.js.map +1 -0
- package/dist/contracts/v1/agentProfileManifest.d.ts +60 -0
- package/dist/contracts/v1/agentProfileManifest.d.ts.map +1 -0
- package/dist/contracts/v1/agentProfileManifest.js +9 -0
- package/dist/contracts/v1/agentProfileManifest.js.map +1 -0
- package/dist/contracts/v1/agentRules.d.ts +60 -0
- package/dist/contracts/v1/agentRules.d.ts.map +1 -0
- package/dist/contracts/v1/agentRules.js +10 -0
- package/dist/contracts/v1/agentRules.js.map +1 -0
- package/dist/contracts/v1/provider.d.ts +149 -0
- package/dist/contracts/v1/provider.d.ts.map +1 -0
- package/dist/contracts/v1/provider.js +7 -0
- package/dist/contracts/v1/provider.js.map +1 -0
- package/dist/contracts/v1/tool.d.ts +136 -0
- package/dist/contracts/v1/tool.d.ts.map +1 -0
- package/dist/contracts/v1/tool.js +7 -0
- package/dist/contracts/v1/tool.js.map +1 -0
- package/dist/contracts/v1/toolAccess.d.ts +43 -0
- package/dist/contracts/v1/toolAccess.d.ts.map +1 -0
- package/dist/contracts/v1/toolAccess.js +9 -0
- package/dist/contracts/v1/toolAccess.js.map +1 -0
- package/dist/core/agent.d.ts +287 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +1563 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/agentProfileManifest.d.ts +3 -0
- package/dist/core/agentProfileManifest.d.ts.map +1 -0
- package/dist/core/agentProfileManifest.js +188 -0
- package/dist/core/agentProfileManifest.js.map +1 -0
- package/dist/core/agentProfiles.d.ts +22 -0
- package/dist/core/agentProfiles.d.ts.map +1 -0
- package/dist/core/agentProfiles.js +35 -0
- package/dist/core/agentProfiles.js.map +1 -0
- package/dist/core/agentRulebook.d.ts +11 -0
- package/dist/core/agentRulebook.d.ts.map +1 -0
- package/dist/core/agentRulebook.js +136 -0
- package/dist/core/agentRulebook.js.map +1 -0
- package/dist/core/agentSchemaLoader.d.ts +131 -0
- package/dist/core/agentSchemaLoader.d.ts.map +1 -0
- package/dist/core/agentSchemaLoader.js +235 -0
- package/dist/core/agentSchemaLoader.js.map +1 -0
- package/dist/core/agiCore.d.ts +290 -0
- package/dist/core/agiCore.d.ts.map +1 -0
- package/dist/core/agiCore.js +1348 -0
- package/dist/core/agiCore.js.map +1 -0
- package/dist/core/aiErrorFixer.d.ts +57 -0
- package/dist/core/aiErrorFixer.d.ts.map +1 -0
- package/dist/core/aiErrorFixer.js +214 -0
- package/dist/core/aiErrorFixer.js.map +1 -0
- package/dist/core/antiTermination.d.ts +226 -0
- package/dist/core/antiTermination.d.ts.map +1 -0
- package/dist/core/antiTermination.js +713 -0
- package/dist/core/antiTermination.js.map +1 -0
- package/dist/core/appleSecurityAudit.d.ts +98 -0
- package/dist/core/appleSecurityAudit.d.ts.map +1 -0
- package/dist/core/appleSecurityAudit.js +505 -0
- package/dist/core/appleSecurityAudit.js.map +1 -0
- package/dist/core/appleSecurityIntegration.d.ts +130 -0
- package/dist/core/appleSecurityIntegration.d.ts.map +1 -0
- package/dist/core/appleSecurityIntegration.js +697 -0
- package/dist/core/appleSecurityIntegration.js.map +1 -0
- package/dist/core/bashCommandGuidance.d.ts +16 -0
- package/dist/core/bashCommandGuidance.d.ts.map +1 -0
- package/dist/core/bashCommandGuidance.js +40 -0
- package/dist/core/bashCommandGuidance.js.map +1 -0
- package/dist/core/constants.d.ts +31 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +62 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/contextManager.d.ts +271 -0
- package/dist/core/contextManager.d.ts.map +1 -0
- package/dist/core/contextManager.js +1073 -0
- package/dist/core/contextManager.js.map +1 -0
- package/dist/core/contextWindow.d.ts +42 -0
- package/dist/core/contextWindow.d.ts.map +1 -0
- package/dist/core/contextWindow.js +123 -0
- package/dist/core/contextWindow.js.map +1 -0
- package/dist/core/customCommands.d.ts +19 -0
- package/dist/core/customCommands.d.ts.map +1 -0
- package/dist/core/customCommands.js +85 -0
- package/dist/core/customCommands.js.map +1 -0
- package/dist/core/deepBugAnalyzer.d.ts +25 -0
- package/dist/core/deepBugAnalyzer.d.ts.map +1 -0
- package/dist/core/deepBugAnalyzer.js +44 -0
- package/dist/core/deepBugAnalyzer.js.map +1 -0
- package/dist/core/dualTournament.d.ts +110 -0
- package/dist/core/dualTournament.d.ts.map +1 -0
- package/dist/core/dualTournament.js +270 -0
- package/dist/core/dualTournament.js.map +1 -0
- package/dist/core/dynamicGuardrails.d.ts +207 -0
- package/dist/core/dynamicGuardrails.d.ts.map +1 -0
- package/dist/core/dynamicGuardrails.js +516 -0
- package/dist/core/dynamicGuardrails.js.map +1 -0
- package/dist/core/embeddingProviders.d.ts +80 -0
- package/dist/core/embeddingProviders.d.ts.map +1 -0
- package/dist/core/embeddingProviders.js +241 -0
- package/dist/core/embeddingProviders.js.map +1 -0
- package/dist/core/episodicMemory.d.ts +259 -0
- package/dist/core/episodicMemory.d.ts.map +1 -0
- package/dist/core/episodicMemory.js +833 -0
- package/dist/core/episodicMemory.js.map +1 -0
- package/dist/core/errors/apiKeyErrors.d.ts +11 -0
- package/dist/core/errors/apiKeyErrors.d.ts.map +1 -0
- package/dist/core/errors/apiKeyErrors.js +159 -0
- package/dist/core/errors/apiKeyErrors.js.map +1 -0
- package/dist/core/errors/errorTypes.d.ts +111 -0
- package/dist/core/errors/errorTypes.d.ts.map +1 -0
- package/dist/core/errors/errorTypes.js +345 -0
- package/dist/core/errors/errorTypes.js.map +1 -0
- package/dist/core/errors/index.d.ts +50 -0
- package/dist/core/errors/index.d.ts.map +1 -0
- package/dist/core/errors/index.js +156 -0
- package/dist/core/errors/index.js.map +1 -0
- package/dist/core/errors/networkErrors.d.ts +14 -0
- package/dist/core/errors/networkErrors.d.ts.map +1 -0
- package/dist/core/errors/networkErrors.js +53 -0
- package/dist/core/errors/networkErrors.js.map +1 -0
- package/dist/core/errors/safetyValidator.d.ts +115 -0
- package/dist/core/errors/safetyValidator.d.ts.map +1 -0
- package/dist/core/errors/safetyValidator.js +302 -0
- package/dist/core/errors/safetyValidator.js.map +1 -0
- package/dist/core/errors.d.ts +4 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +33 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/finalResponseFormatter.d.ts +10 -0
- package/dist/core/finalResponseFormatter.d.ts.map +1 -0
- package/dist/core/finalResponseFormatter.js +14 -0
- package/dist/core/finalResponseFormatter.js.map +1 -0
- package/dist/core/flowProtection.d.ts +154 -0
- package/dist/core/flowProtection.d.ts.map +1 -0
- package/dist/core/flowProtection.js +436 -0
- package/dist/core/flowProtection.js.map +1 -0
- package/dist/core/gitWorktreeManager.d.ts +126 -0
- package/dist/core/gitWorktreeManager.d.ts.map +1 -0
- package/dist/core/gitWorktreeManager.js +403 -0
- package/dist/core/gitWorktreeManager.js.map +1 -0
- package/dist/core/guardrails.d.ts +150 -0
- package/dist/core/guardrails.d.ts.map +1 -0
- package/dist/core/guardrails.js +360 -0
- package/dist/core/guardrails.js.map +1 -0
- package/dist/core/hallucinationGuard.d.ts +57 -0
- package/dist/core/hallucinationGuard.d.ts.map +1 -0
- package/dist/core/hallucinationGuard.js +237 -0
- package/dist/core/hallucinationGuard.js.map +1 -0
- package/dist/core/hooks.d.ts +113 -0
- package/dist/core/hooks.d.ts.map +1 -0
- package/dist/core/hooks.js +364 -0
- package/dist/core/hooks.js.map +1 -0
- package/dist/core/hotReload.d.ts +154 -0
- package/dist/core/hotReload.d.ts.map +1 -0
- package/dist/core/hotReload.js +451 -0
- package/dist/core/hotReload.js.map +1 -0
- package/dist/core/hypothesisEngine.d.ts +27 -0
- package/dist/core/hypothesisEngine.d.ts.map +1 -0
- package/dist/core/hypothesisEngine.js +58 -0
- package/dist/core/hypothesisEngine.js.map +1 -0
- package/dist/core/index.d.ts +26 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +54 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/inputProtection.d.ts +122 -0
- package/dist/core/inputProtection.d.ts.map +1 -0
- package/dist/core/inputProtection.js +421 -0
- package/dist/core/inputProtection.js.map +1 -0
- package/dist/core/liveGCPVerification.d.ts +41 -0
- package/dist/core/liveGCPVerification.d.ts.map +1 -0
- package/dist/core/liveGCPVerification.js +745 -0
- package/dist/core/liveGCPVerification.js.map +1 -0
- package/dist/core/modelDiscovery.d.ts +105 -0
- package/dist/core/modelDiscovery.d.ts.map +1 -0
- package/dist/core/modelDiscovery.js +740 -0
- package/dist/core/modelDiscovery.js.map +1 -0
- package/dist/core/multilinePasteHandler.d.ts +35 -0
- package/dist/core/multilinePasteHandler.d.ts.map +1 -0
- package/dist/core/multilinePasteHandler.js +80 -0
- package/dist/core/multilinePasteHandler.js.map +1 -0
- package/dist/core/parallel.d.ts +85 -0
- package/dist/core/parallel.d.ts.map +1 -0
- package/dist/core/parallel.js +150 -0
- package/dist/core/parallel.js.map +1 -0
- package/dist/core/parallelCoordinator.d.ts +21 -0
- package/dist/core/parallelCoordinator.d.ts.map +1 -0
- package/dist/core/parallelCoordinator.js +42 -0
- package/dist/core/parallelCoordinator.js.map +1 -0
- package/dist/core/parallelExecutor.d.ts +215 -0
- package/dist/core/parallelExecutor.d.ts.map +1 -0
- package/dist/core/parallelExecutor.js +584 -0
- package/dist/core/parallelExecutor.js.map +1 -0
- package/dist/core/preferences.d.ts +71 -0
- package/dist/core/preferences.d.ts.map +1 -0
- package/dist/core/preferences.js +341 -0
- package/dist/core/preferences.js.map +1 -0
- package/dist/core/productTestHarness.d.ts +46 -0
- package/dist/core/productTestHarness.d.ts.map +1 -0
- package/dist/core/productTestHarness.js +128 -0
- package/dist/core/productTestHarness.js.map +1 -0
- package/dist/core/providerKeys.d.ts +20 -0
- package/dist/core/providerKeys.d.ts.map +1 -0
- package/dist/core/providerKeys.js +40 -0
- package/dist/core/providerKeys.js.map +1 -0
- package/dist/core/realityScore.d.ts +159 -0
- package/dist/core/realityScore.d.ts.map +1 -0
- package/dist/core/realityScore.js +734 -0
- package/dist/core/realityScore.js.map +1 -0
- package/dist/core/repoUpgradeOrchestrator.d.ts +223 -0
- package/dist/core/repoUpgradeOrchestrator.d.ts.map +1 -0
- package/dist/core/repoUpgradeOrchestrator.js +1003 -0
- package/dist/core/repoUpgradeOrchestrator.js.map +1 -0
- package/dist/core/resultVerification.d.ts +47 -0
- package/dist/core/resultVerification.d.ts.map +1 -0
- package/dist/core/resultVerification.js +126 -0
- package/dist/core/resultVerification.js.map +1 -0
- package/dist/core/revenueEnvValidator.d.ts +30 -0
- package/dist/core/revenueEnvValidator.d.ts.map +1 -0
- package/dist/core/revenueEnvValidator.js +241 -0
- package/dist/core/revenueEnvValidator.js.map +1 -0
- package/dist/core/schemaValidator.d.ts +49 -0
- package/dist/core/schemaValidator.d.ts.map +1 -0
- package/dist/core/schemaValidator.js +234 -0
- package/dist/core/schemaValidator.js.map +1 -0
- package/dist/core/secretStore.d.ts +48 -0
- package/dist/core/secretStore.d.ts.map +1 -0
- package/dist/core/secretStore.js +295 -0
- package/dist/core/secretStore.js.map +1 -0
- package/dist/core/securityTournament.d.ts +83 -0
- package/dist/core/securityTournament.d.ts.map +1 -0
- package/dist/core/securityTournament.js +357 -0
- package/dist/core/securityTournament.js.map +1 -0
- package/dist/core/selfUpgrade.d.ts +253 -0
- package/dist/core/selfUpgrade.d.ts.map +1 -0
- package/dist/core/selfUpgrade.js +669 -0
- package/dist/core/selfUpgrade.js.map +1 -0
- package/dist/core/sessionStorage.d.ts +10 -0
- package/dist/core/sessionStorage.d.ts.map +1 -0
- package/dist/core/sessionStorage.js +46 -0
- package/dist/core/sessionStorage.js.map +1 -0
- package/dist/core/sessionStore.d.ts +35 -0
- package/dist/core/sessionStore.d.ts.map +1 -0
- package/dist/core/sessionStore.js +191 -0
- package/dist/core/sessionStore.js.map +1 -0
- package/dist/core/taskCompletionDetector.d.ts +112 -0
- package/dist/core/taskCompletionDetector.d.ts.map +1 -0
- package/dist/core/taskCompletionDetector.js +469 -0
- package/dist/core/taskCompletionDetector.js.map +1 -0
- package/dist/core/toolPreconditions.d.ts +34 -0
- package/dist/core/toolPreconditions.d.ts.map +1 -0
- package/dist/core/toolPreconditions.js +242 -0
- package/dist/core/toolPreconditions.js.map +1 -0
- package/dist/core/toolRuntime.d.ts +185 -0
- package/dist/core/toolRuntime.d.ts.map +1 -0
- package/dist/core/toolRuntime.js +412 -0
- package/dist/core/toolRuntime.js.map +1 -0
- package/dist/core/tournamentStrategy.d.ts +12 -0
- package/dist/core/tournamentStrategy.d.ts.map +1 -0
- package/dist/core/tournamentStrategy.js +41 -0
- package/dist/core/tournamentStrategy.js.map +1 -0
- package/dist/core/types/utilityTypes.d.ts +192 -0
- package/dist/core/types/utilityTypes.d.ts.map +1 -0
- package/dist/core/types/utilityTypes.js +272 -0
- package/dist/core/types/utilityTypes.js.map +1 -0
- package/dist/core/types.d.ts +334 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +76 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/unifiedOrchestrator.d.ts +47 -0
- package/dist/core/unifiedOrchestrator.d.ts.map +1 -0
- package/dist/core/unifiedOrchestrator.js +103 -0
- package/dist/core/unifiedOrchestrator.js.map +1 -0
- package/dist/core/universalSecurityAudit.d.ts +104 -0
- package/dist/core/universalSecurityAudit.d.ts.map +1 -0
- package/dist/core/universalSecurityAudit.js +2190 -0
- package/dist/core/universalSecurityAudit.js.map +1 -0
- package/dist/core/updateChecker.d.ts +148 -0
- package/dist/core/updateChecker.d.ts.map +1 -0
- package/dist/core/updateChecker.js +593 -0
- package/dist/core/updateChecker.js.map +1 -0
- package/dist/core/variantExecution.d.ts +23 -0
- package/dist/core/variantExecution.d.ts.map +1 -0
- package/dist/core/variantExecution.js +58 -0
- package/dist/core/variantExecution.js.map +1 -0
- package/dist/core/winnerStrategy.d.ts +15 -0
- package/dist/core/winnerStrategy.d.ts.map +1 -0
- package/dist/core/winnerStrategy.js +18 -0
- package/dist/core/winnerStrategy.js.map +1 -0
- package/dist/core/zeroDayDiscovery.d.ts +96 -0
- package/dist/core/zeroDayDiscovery.d.ts.map +1 -0
- package/dist/core/zeroDayDiscovery.js +358 -0
- package/dist/core/zeroDayDiscovery.js.map +1 -0
- package/dist/headless/interactiveShell.d.ts +22 -0
- package/dist/headless/interactiveShell.d.ts.map +1 -0
- package/dist/headless/interactiveShell.js +3799 -0
- package/dist/headless/interactiveShell.js.map +1 -0
- package/dist/headless/quickMode.d.ts +26 -0
- package/dist/headless/quickMode.d.ts.map +1 -0
- package/dist/headless/quickMode.js +226 -0
- package/dist/headless/quickMode.js.map +1 -0
- package/dist/orchestration/index.d.ts +10 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +13 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/repoUpgradeRunner.d.ts +44 -0
- package/dist/orchestration/repoUpgradeRunner.d.ts.map +1 -0
- package/dist/orchestration/repoUpgradeRunner.js +375 -0
- package/dist/orchestration/repoUpgradeRunner.js.map +1 -0
- package/dist/orchestration/securityAuditRunner.d.ts +144 -0
- package/dist/orchestration/securityAuditRunner.d.ts.map +1 -0
- package/dist/orchestration/securityAuditRunner.js +526 -0
- package/dist/orchestration/securityAuditRunner.js.map +1 -0
- package/dist/plugins/index.d.ts +49 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +105 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/providers/deepseek/index.d.ts +11 -0
- package/dist/plugins/providers/deepseek/index.d.ts.map +1 -0
- package/dist/plugins/providers/deepseek/index.js +54 -0
- package/dist/plugins/providers/deepseek/index.js.map +1 -0
- package/dist/plugins/providers/index.d.ts +2 -0
- package/dist/plugins/providers/index.d.ts.map +1 -0
- package/dist/plugins/providers/index.js +11 -0
- package/dist/plugins/providers/index.js.map +1 -0
- package/dist/plugins/tools/agentSpawning/agentSpawningPlugin.d.ts +3 -0
- package/dist/plugins/tools/agentSpawning/agentSpawningPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/agentSpawning/agentSpawningPlugin.js +27 -0
- package/dist/plugins/tools/agentSpawning/agentSpawningPlugin.js.map +1 -0
- package/dist/plugins/tools/apple/secureApplePlugin.d.ts +3 -0
- package/dist/plugins/tools/apple/secureApplePlugin.d.ts.map +1 -0
- package/dist/plugins/tools/apple/secureApplePlugin.js +26 -0
- package/dist/plugins/tools/apple/secureApplePlugin.js.map +1 -0
- package/dist/plugins/tools/authorizedSecurity/authorizedSecurityPlugin.d.ts +3 -0
- package/dist/plugins/tools/authorizedSecurity/authorizedSecurityPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/authorizedSecurity/authorizedSecurityPlugin.js +9 -0
- package/dist/plugins/tools/authorizedSecurity/authorizedSecurityPlugin.js.map +1 -0
- package/dist/plugins/tools/bash/localBashPlugin.d.ts +3 -0
- package/dist/plugins/tools/bash/localBashPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/bash/localBashPlugin.js +14 -0
- package/dist/plugins/tools/bash/localBashPlugin.js.map +1 -0
- package/dist/plugins/tools/bidirectionalAudit/bidirectionalAuditPlugin.d.ts +3 -0
- package/dist/plugins/tools/bidirectionalAudit/bidirectionalAuditPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/bidirectionalAudit/bidirectionalAuditPlugin.js +27 -0
- package/dist/plugins/tools/bidirectionalAudit/bidirectionalAuditPlugin.js.map +1 -0
- package/dist/plugins/tools/edit/editPlugin.d.ts +9 -0
- package/dist/plugins/tools/edit/editPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/edit/editPlugin.js +15 -0
- package/dist/plugins/tools/edit/editPlugin.js.map +1 -0
- package/dist/plugins/tools/enhancedGit/enhancedGitPlugin.d.ts +3 -0
- package/dist/plugins/tools/enhancedGit/enhancedGitPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/enhancedGit/enhancedGitPlugin.js +9 -0
- package/dist/plugins/tools/enhancedGit/enhancedGitPlugin.js.map +1 -0
- package/dist/plugins/tools/filesystem/localFilesystemPlugin.d.ts +3 -0
- package/dist/plugins/tools/filesystem/localFilesystemPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/filesystem/localFilesystemPlugin.js +14 -0
- package/dist/plugins/tools/filesystem/localFilesystemPlugin.js.map +1 -0
- package/dist/plugins/tools/gitHistory/gitHistoryPlugin.d.ts +3 -0
- package/dist/plugins/tools/gitHistory/gitHistoryPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/gitHistory/gitHistoryPlugin.js +9 -0
- package/dist/plugins/tools/gitHistory/gitHistoryPlugin.js.map +1 -0
- package/dist/plugins/tools/index.d.ts +3 -0
- package/dist/plugins/tools/index.d.ts.map +1 -0
- package/dist/plugins/tools/index.js +3 -0
- package/dist/plugins/tools/index.js.map +1 -0
- package/dist/plugins/tools/integrity/integrityPlugin.d.ts +3 -0
- package/dist/plugins/tools/integrity/integrityPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/integrity/integrityPlugin.js +31 -0
- package/dist/plugins/tools/integrity/integrityPlugin.js.map +1 -0
- package/dist/plugins/tools/mcp/mcpPlugin.d.ts +3 -0
- package/dist/plugins/tools/mcp/mcpPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/mcp/mcpPlugin.js +27 -0
- package/dist/plugins/tools/mcp/mcpPlugin.js.map +1 -0
- package/dist/plugins/tools/nodeDefaults.d.ts +15 -0
- package/dist/plugins/tools/nodeDefaults.d.ts.map +1 -0
- package/dist/plugins/tools/nodeDefaults.js +37 -0
- package/dist/plugins/tools/nodeDefaults.js.map +1 -0
- package/dist/plugins/tools/offensiveDestruction/offensiveDestructionPlugin.d.ts +3 -0
- package/dist/plugins/tools/offensiveDestruction/offensiveDestructionPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/offensiveDestruction/offensiveDestructionPlugin.js +9 -0
- package/dist/plugins/tools/offensiveDestruction/offensiveDestructionPlugin.js.map +1 -0
- package/dist/plugins/tools/orchestration/orchestrationPlugin.d.ts +3 -0
- package/dist/plugins/tools/orchestration/orchestrationPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/orchestration/orchestrationPlugin.js +340 -0
- package/dist/plugins/tools/orchestration/orchestrationPlugin.js.map +1 -0
- package/dist/plugins/tools/registry.d.ts +22 -0
- package/dist/plugins/tools/registry.d.ts.map +1 -0
- package/dist/plugins/tools/registry.js +58 -0
- package/dist/plugins/tools/registry.js.map +1 -0
- package/dist/plugins/tools/search/localSearchPlugin.d.ts +3 -0
- package/dist/plugins/tools/search/localSearchPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/search/localSearchPlugin.js +14 -0
- package/dist/plugins/tools/search/localSearchPlugin.js.map +1 -0
- package/dist/plugins/tools/skills/skillPlugin.d.ts +3 -0
- package/dist/plugins/tools/skills/skillPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/skills/skillPlugin.js +27 -0
- package/dist/plugins/tools/skills/skillPlugin.js.map +1 -0
- package/dist/plugins/tools/tao/secureTaoPlugin.d.ts +3 -0
- package/dist/plugins/tools/tao/secureTaoPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/tao/secureTaoPlugin.js +37 -0
- package/dist/plugins/tools/tao/secureTaoPlugin.js.map +1 -0
- package/dist/providers/baseProvider.d.ts +148 -0
- package/dist/providers/baseProvider.d.ts.map +1 -0
- package/dist/providers/baseProvider.js +284 -0
- package/dist/providers/baseProvider.js.map +1 -0
- package/dist/providers/openaiChatCompletionsProvider.d.ts +64 -0
- package/dist/providers/openaiChatCompletionsProvider.d.ts.map +1 -0
- package/dist/providers/openaiChatCompletionsProvider.js +1000 -0
- package/dist/providers/openaiChatCompletionsProvider.js.map +1 -0
- package/dist/providers/providerFactory.d.ts +22 -0
- package/dist/providers/providerFactory.d.ts.map +1 -0
- package/dist/providers/providerFactory.js +25 -0
- package/dist/providers/providerFactory.js.map +1 -0
- package/dist/providers/resilientProvider.d.ts +103 -0
- package/dist/providers/resilientProvider.d.ts.map +1 -0
- package/dist/providers/resilientProvider.js +462 -0
- package/dist/providers/resilientProvider.js.map +1 -0
- package/dist/runtime/agentController.d.ts +114 -0
- package/dist/runtime/agentController.d.ts.map +1 -0
- package/dist/runtime/agentController.js +693 -0
- package/dist/runtime/agentController.js.map +1 -0
- package/dist/runtime/agentHost.d.ts +61 -0
- package/dist/runtime/agentHost.d.ts.map +1 -0
- package/dist/runtime/agentHost.js +157 -0
- package/dist/runtime/agentHost.js.map +1 -0
- package/dist/runtime/agentSession.d.ts +45 -0
- package/dist/runtime/agentSession.d.ts.map +1 -0
- package/dist/runtime/agentSession.js +210 -0
- package/dist/runtime/agentSession.js.map +1 -0
- package/dist/runtime/agentWorkerPool.d.ts +167 -0
- package/dist/runtime/agentWorkerPool.d.ts.map +1 -0
- package/dist/runtime/agentWorkerPool.js +435 -0
- package/dist/runtime/agentWorkerPool.js.map +1 -0
- package/dist/runtime/node.d.ts +7 -0
- package/dist/runtime/node.d.ts.map +1 -0
- package/dist/runtime/node.js +24 -0
- package/dist/runtime/node.js.map +1 -0
- package/dist/runtime/universal.d.ts +18 -0
- package/dist/runtime/universal.d.ts.map +1 -0
- package/dist/runtime/universal.js +21 -0
- package/dist/runtime/universal.js.map +1 -0
- package/dist/shell/autoExecutor.d.ts +70 -0
- package/dist/shell/autoExecutor.d.ts.map +1 -0
- package/dist/shell/autoExecutor.js +320 -0
- package/dist/shell/autoExecutor.js.map +1 -0
- package/dist/shell/commandRegistry.d.ts +122 -0
- package/dist/shell/commandRegistry.d.ts.map +1 -0
- package/dist/shell/commandRegistry.js +386 -0
- package/dist/shell/commandRegistry.js.map +1 -0
- package/dist/shell/composableMessage.d.ts +183 -0
- package/dist/shell/composableMessage.d.ts.map +1 -0
- package/dist/shell/composableMessage.js +420 -0
- package/dist/shell/composableMessage.js.map +1 -0
- package/dist/shell/liveStatus.d.ts +27 -0
- package/dist/shell/liveStatus.d.ts.map +1 -0
- package/dist/shell/liveStatus.js +53 -0
- package/dist/shell/liveStatus.js.map +1 -0
- package/dist/shell/systemPrompt.d.ts +12 -0
- package/dist/shell/systemPrompt.d.ts.map +1 -0
- package/dist/shell/systemPrompt.js +16 -0
- package/dist/shell/systemPrompt.js.map +1 -0
- package/dist/shell/vimMode.d.ts +66 -0
- package/dist/shell/vimMode.d.ts.map +1 -0
- package/dist/shell/vimMode.js +435 -0
- package/dist/shell/vimMode.js.map +1 -0
- package/dist/tools/bashTools.d.ts +6 -0
- package/dist/tools/bashTools.d.ts.map +1 -0
- package/dist/tools/bashTools.js +485 -0
- package/dist/tools/bashTools.js.map +1 -0
- package/dist/tools/diffUtils.d.ts +43 -0
- package/dist/tools/diffUtils.d.ts.map +1 -0
- package/dist/tools/diffUtils.js +607 -0
- package/dist/tools/diffUtils.js.map +1 -0
- package/dist/tools/editTools.d.ts +29 -0
- package/dist/tools/editTools.d.ts.map +1 -0
- package/dist/tools/editTools.js +702 -0
- package/dist/tools/editTools.js.map +1 -0
- package/dist/tools/emailTools.d.ts +140 -0
- package/dist/tools/emailTools.d.ts.map +1 -0
- package/dist/tools/emailTools.js +792 -0
- package/dist/tools/emailTools.js.map +1 -0
- package/dist/tools/fileReadTracker.d.ts +69 -0
- package/dist/tools/fileReadTracker.d.ts.map +1 -0
- package/dist/tools/fileReadTracker.js +213 -0
- package/dist/tools/fileReadTracker.js.map +1 -0
- package/dist/tools/fileTools.d.ts +3 -0
- package/dist/tools/fileTools.d.ts.map +1 -0
- package/dist/tools/fileTools.js +342 -0
- package/dist/tools/fileTools.js.map +1 -0
- package/dist/tools/grepTools.d.ts +3 -0
- package/dist/tools/grepTools.d.ts.map +1 -0
- package/dist/tools/grepTools.js +129 -0
- package/dist/tools/grepTools.js.map +1 -0
- package/dist/tools/humanOpsTools.d.ts +3 -0
- package/dist/tools/humanOpsTools.d.ts.map +1 -0
- package/dist/tools/humanOpsTools.js +86 -0
- package/dist/tools/humanOpsTools.js.map +1 -0
- package/dist/tools/localExplore.d.ts +38 -0
- package/dist/tools/localExplore.d.ts.map +1 -0
- package/dist/tools/localExplore.js +30 -0
- package/dist/tools/localExplore.js.map +1 -0
- package/dist/tools/metaTools.d.ts +3 -0
- package/dist/tools/metaTools.d.ts.map +1 -0
- package/dist/tools/metaTools.js +148 -0
- package/dist/tools/metaTools.js.map +1 -0
- package/dist/tools/planningTools.d.ts +12 -0
- package/dist/tools/planningTools.d.ts.map +1 -0
- package/dist/tools/planningTools.js +75 -0
- package/dist/tools/planningTools.js.map +1 -0
- package/dist/tools/searchTools.d.ts +12 -0
- package/dist/tools/searchTools.d.ts.map +1 -0
- package/dist/tools/searchTools.js +370 -0
- package/dist/tools/searchTools.js.map +1 -0
- package/dist/tools/secureAppleExploitation.d.ts +29 -0
- package/dist/tools/secureAppleExploitation.d.ts.map +1 -0
- package/dist/tools/secureAppleExploitation.js +518 -0
- package/dist/tools/secureAppleExploitation.js.map +1 -0
- package/dist/tools/telemetryTools.d.ts +5 -0
- package/dist/tools/telemetryTools.d.ts.map +1 -0
- package/dist/tools/telemetryTools.js +9 -0
- package/dist/tools/telemetryTools.js.map +1 -0
- package/dist/tools/unifiedOps.d.ts +3 -0
- package/dist/tools/unifiedOps.d.ts.map +1 -0
- package/dist/tools/unifiedOps.js +57 -0
- package/dist/tools/unifiedOps.js.map +1 -0
- package/dist/tools/webTools.d.ts +26 -0
- package/dist/tools/webTools.d.ts.map +1 -0
- package/dist/tools/webTools.js +227 -0
- package/dist/tools/webTools.js.map +1 -0
- package/dist/ui/PromptController.d.ts +174 -0
- package/dist/ui/PromptController.d.ts.map +1 -0
- package/dist/ui/PromptController.js +351 -0
- package/dist/ui/PromptController.js.map +1 -0
- package/dist/ui/UnifiedUIRenderer.d.ts +779 -0
- package/dist/ui/UnifiedUIRenderer.d.ts.map +1 -0
- package/dist/ui/UnifiedUIRenderer.js +5458 -0
- package/dist/ui/UnifiedUIRenderer.js.map +1 -0
- package/dist/ui/animatedStatus.d.ts +140 -0
- package/dist/ui/animatedStatus.d.ts.map +1 -0
- package/dist/ui/animatedStatus.js +480 -0
- package/dist/ui/animatedStatus.js.map +1 -0
- package/dist/ui/animation/AnimationScheduler.d.ts +197 -0
- package/dist/ui/animation/AnimationScheduler.d.ts.map +1 -0
- package/dist/ui/animation/AnimationScheduler.js +440 -0
- package/dist/ui/animation/AnimationScheduler.js.map +1 -0
- package/dist/ui/codeHighlighter.d.ts +6 -0
- package/dist/ui/codeHighlighter.d.ts.map +1 -0
- package/dist/ui/codeHighlighter.js +855 -0
- package/dist/ui/codeHighlighter.js.map +1 -0
- package/dist/ui/designSystem.d.ts +26 -0
- package/dist/ui/designSystem.d.ts.map +1 -0
- package/dist/ui/designSystem.js +114 -0
- package/dist/ui/designSystem.js.map +1 -0
- package/dist/ui/errorFormatter.d.ts +64 -0
- package/dist/ui/errorFormatter.d.ts.map +1 -0
- package/dist/ui/errorFormatter.js +316 -0
- package/dist/ui/errorFormatter.js.map +1 -0
- package/dist/ui/globalWriteLock.d.ts +63 -0
- package/dist/ui/globalWriteLock.d.ts.map +1 -0
- package/dist/ui/globalWriteLock.js +173 -0
- package/dist/ui/globalWriteLock.js.map +1 -0
- package/dist/ui/index.d.ts +32 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +54 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/interrupts/InterruptManager.d.ts +157 -0
- package/dist/ui/interrupts/InterruptManager.d.ts.map +1 -0
- package/dist/ui/interrupts/InterruptManager.js +501 -0
- package/dist/ui/interrupts/InterruptManager.js.map +1 -0
- package/dist/ui/layout.d.ts +27 -0
- package/dist/ui/layout.d.ts.map +1 -0
- package/dist/ui/layout.js +184 -0
- package/dist/ui/layout.js.map +1 -0
- package/dist/ui/maxOffensiveUkraineUI.d.ts +94 -0
- package/dist/ui/maxOffensiveUkraineUI.d.ts.map +1 -0
- package/dist/ui/maxOffensiveUkraineUI.js +316 -0
- package/dist/ui/maxOffensiveUkraineUI.js.map +1 -0
- package/dist/ui/outputMode.d.ts +44 -0
- package/dist/ui/outputMode.d.ts.map +1 -0
- package/dist/ui/outputMode.js +123 -0
- package/dist/ui/outputMode.js.map +1 -0
- package/dist/ui/overlay/OverlayManager.d.ts +105 -0
- package/dist/ui/overlay/OverlayManager.d.ts.map +1 -0
- package/dist/ui/overlay/OverlayManager.js +291 -0
- package/dist/ui/overlay/OverlayManager.js.map +1 -0
- package/dist/ui/premiumComponents.d.ts +54 -0
- package/dist/ui/premiumComponents.d.ts.map +1 -0
- package/dist/ui/premiumComponents.js +241 -0
- package/dist/ui/premiumComponents.js.map +1 -0
- package/dist/ui/richText.d.ts +13 -0
- package/dist/ui/richText.d.ts.map +1 -0
- package/dist/ui/richText.js +443 -0
- package/dist/ui/richText.js.map +1 -0
- package/dist/ui/telemetry/ResponseTracker.d.ts +22 -0
- package/dist/ui/telemetry/ResponseTracker.d.ts.map +1 -0
- package/dist/ui/telemetry/ResponseTracker.js +60 -0
- package/dist/ui/telemetry/ResponseTracker.js.map +1 -0
- package/dist/ui/telemetry/UITelemetry.d.ts +181 -0
- package/dist/ui/telemetry/UITelemetry.d.ts.map +1 -0
- package/dist/ui/telemetry/UITelemetry.js +446 -0
- package/dist/ui/telemetry/UITelemetry.js.map +1 -0
- package/dist/ui/textHighlighter.d.ts +83 -0
- package/dist/ui/textHighlighter.d.ts.map +1 -0
- package/dist/ui/textHighlighter.js +267 -0
- package/dist/ui/textHighlighter.js.map +1 -0
- package/dist/ui/theme.d.ts +364 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +471 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/toolDisplay.d.ts +221 -0
- package/dist/ui/toolDisplay.d.ts.map +1 -0
- package/dist/ui/toolDisplay.js +1654 -0
- package/dist/ui/toolDisplay.js.map +1 -0
- package/dist/ui/uiConstants.d.ts +288 -0
- package/dist/ui/uiConstants.d.ts.map +1 -0
- package/dist/ui/uiConstants.js +472 -0
- package/dist/ui/uiConstants.js.map +1 -0
- package/dist/utils/askUserPrompt.d.ts +21 -0
- package/dist/utils/askUserPrompt.d.ts.map +1 -0
- package/dist/utils/askUserPrompt.js +87 -0
- package/dist/utils/askUserPrompt.js.map +1 -0
- package/dist/utils/asyncUtils.d.ts +95 -0
- package/dist/utils/asyncUtils.d.ts.map +1 -0
- package/dist/utils/asyncUtils.js +286 -0
- package/dist/utils/asyncUtils.js.map +1 -0
- package/dist/utils/debugLogger.d.ts +6 -0
- package/dist/utils/debugLogger.d.ts.map +1 -0
- package/dist/utils/debugLogger.js +39 -0
- package/dist/utils/debugLogger.js.map +1 -0
- package/dist/utils/errorUtils.d.ts +12 -0
- package/dist/utils/errorUtils.d.ts.map +1 -0
- package/dist/utils/errorUtils.js +83 -0
- package/dist/utils/errorUtils.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +10 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +78 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/packageInfo.d.ts +14 -0
- package/dist/utils/packageInfo.d.ts.map +1 -0
- package/dist/utils/packageInfo.js +45 -0
- package/dist/utils/packageInfo.js.map +1 -0
- package/dist/utils/planFormatter.d.ts +34 -0
- package/dist/utils/planFormatter.d.ts.map +1 -0
- package/dist/utils/planFormatter.js +141 -0
- package/dist/utils/planFormatter.js.map +1 -0
- package/dist/utils/securityUtils.d.ts +132 -0
- package/dist/utils/securityUtils.d.ts.map +1 -0
- package/dist/utils/securityUtils.js +324 -0
- package/dist/utils/securityUtils.js.map +1 -0
- package/dist/workspace.d.ts +8 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +134 -0
- package/dist/workspace.js.map +1 -0
- package/dist/workspace.validator.d.ts +49 -0
- package/dist/workspace.validator.d.ts.map +1 -0
- package/dist/workspace.validator.js +215 -0
- package/dist/workspace.validator.js.map +1 -0
- package/package.json +108 -0
|
@@ -0,0 +1,1000 @@
|
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
import { sanitizeErrorMessage, safeErrorMessage } from '../core/secretStore.js';
|
|
3
|
+
import { logDebug } from '../utils/debugLogger.js';
|
|
4
|
+
import { securityLogger, globalRateLimiter } from '../utils/securityUtils.js';
|
|
5
|
+
/**
|
|
6
|
+
* Security utility for safe JSON parsing with protection against prototype pollution
|
|
7
|
+
*/
|
|
8
|
+
export function safeJSONParse(json, options) {
|
|
9
|
+
const maxDepth = options?.maxDepth ?? 20;
|
|
10
|
+
const maxProperties = options?.maxProperties ?? 1000;
|
|
11
|
+
if (!json || typeof json !== 'string') {
|
|
12
|
+
throw new Error('JSON must be a non-empty string');
|
|
13
|
+
}
|
|
14
|
+
// Check for prototype pollution patterns
|
|
15
|
+
if (json.includes('__proto__') || json.includes('constructor') || json.includes('prototype')) {
|
|
16
|
+
logDebug('[SECURITY] Prototype pollution attempt detected in JSON');
|
|
17
|
+
// Clean the JSON by removing dangerous patterns
|
|
18
|
+
json = json.replace(/["']?__proto__["']?\s*:/g, '"__safe_proto__":')
|
|
19
|
+
.replace(/["']?constructor["']?\s*:/g, '"__safe_constructor__":')
|
|
20
|
+
.replace(/["']?prototype["']?\s*:/g, '"__safe_prototype__":');
|
|
21
|
+
}
|
|
22
|
+
// Parse with depth and property limits
|
|
23
|
+
const parsed = JSON.parse(json, (key, value) => {
|
|
24
|
+
// Depth tracking - prevent circular references and deep nesting
|
|
25
|
+
const depth = this?.__depth ?? 0;
|
|
26
|
+
if (depth > maxDepth) {
|
|
27
|
+
throw new Error(`JSON depth ${depth} exceeds maximum allowed depth ${maxDepth}`);
|
|
28
|
+
}
|
|
29
|
+
// Property count tracking
|
|
30
|
+
const propertyCount = this?.__propertyCount ?? 0;
|
|
31
|
+
if (propertyCount > maxProperties) {
|
|
32
|
+
throw new Error(`JSON property count ${propertyCount} exceeds maximum ${maxProperties}`);
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
});
|
|
36
|
+
return parsed;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validate and sanitize URL for OpenAI baseURL
|
|
40
|
+
*/
|
|
41
|
+
function validateOpenAIBaseURL(url) {
|
|
42
|
+
if (!url || typeof url !== 'string') {
|
|
43
|
+
throw new Error('Base URL must be a non-empty string');
|
|
44
|
+
}
|
|
45
|
+
url = url.trim();
|
|
46
|
+
// Must start with http:// or https://
|
|
47
|
+
if (!url.startsWith('http://') && !url.startsWith('https://')) {
|
|
48
|
+
throw new Error(`Invalid baseURL format: ${url}. Must start with http:// or https://`);
|
|
49
|
+
}
|
|
50
|
+
// Parse URL to validate format
|
|
51
|
+
let parsedUrl;
|
|
52
|
+
try {
|
|
53
|
+
parsedUrl = new URL(url);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
throw new Error(`Invalid URL format: ${url}`);
|
|
57
|
+
}
|
|
58
|
+
// Security: Restrict to OpenAI domains and known safe proxies
|
|
59
|
+
const allowedDomains = [
|
|
60
|
+
'api.openai.com',
|
|
61
|
+
'api.deepseek.com',
|
|
62
|
+
'openrouter.ai',
|
|
63
|
+
'api.groq.com',
|
|
64
|
+
// Add other allowed domains as needed
|
|
65
|
+
];
|
|
66
|
+
const hostname = parsedUrl.hostname;
|
|
67
|
+
const isAllowed = allowedDomains.some(domain => hostname === domain || hostname.endsWith(`.${domain}`));
|
|
68
|
+
if (!isAllowed) {
|
|
69
|
+
console.warn(`SECURITY: Using non-standard OpenAI baseURL: ${hostname}. This could be a security risk.`);
|
|
70
|
+
// Allow but log warning for custom deployments, Azure, etc.
|
|
71
|
+
}
|
|
72
|
+
// Enforce HTTPS for production-like domains
|
|
73
|
+
if (hostname.includes('openai.com') && parsedUrl.protocol !== 'https:') {
|
|
74
|
+
throw new Error(`OpenAI API requires HTTPS for domain ${hostname}`);
|
|
75
|
+
}
|
|
76
|
+
return url;
|
|
77
|
+
}
|
|
78
|
+
const REQUEST_CHAR_LIMIT = 800_000; // Hard cap to avoid provider 413 errors
|
|
79
|
+
// ============================================================================
|
|
80
|
+
// Stream/Fetch Error Types for Detection
|
|
81
|
+
// ============================================================================
|
|
82
|
+
/**
|
|
83
|
+
* Error types that indicate stream or network failures that should be retried
|
|
84
|
+
*/
|
|
85
|
+
const RECOVERABLE_ERROR_PATTERNS = [
|
|
86
|
+
'premature close',
|
|
87
|
+
'premature end',
|
|
88
|
+
'unexpected end',
|
|
89
|
+
'aborted',
|
|
90
|
+
'fetcherror',
|
|
91
|
+
'invalid response body',
|
|
92
|
+
'gunzip',
|
|
93
|
+
'decompress',
|
|
94
|
+
'econnreset',
|
|
95
|
+
'econnrefused',
|
|
96
|
+
'epipe',
|
|
97
|
+
'socket hang up',
|
|
98
|
+
'network',
|
|
99
|
+
'timeout',
|
|
100
|
+
];
|
|
101
|
+
/**
|
|
102
|
+
* Custom error class for provider-specific failures
|
|
103
|
+
*/
|
|
104
|
+
export class ProviderStreamError extends Error {
|
|
105
|
+
isRetryable;
|
|
106
|
+
originalError;
|
|
107
|
+
providerId;
|
|
108
|
+
constructor(message, providerId, originalError, isRetryable = true) {
|
|
109
|
+
// SECURITY: Sanitize the error message to prevent token leakage
|
|
110
|
+
super(sanitizeErrorMessage(message));
|
|
111
|
+
this.name = 'ProviderStreamError';
|
|
112
|
+
this.providerId = providerId;
|
|
113
|
+
this.originalError = originalError;
|
|
114
|
+
this.isRetryable = isRetryable;
|
|
115
|
+
// SECURITY: Sanitize stack trace to prevent token leakage
|
|
116
|
+
if (originalError?.stack) {
|
|
117
|
+
this.stack = `${this.stack}\nCaused by: ${sanitizeErrorMessage(originalError.stack)}`;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Basic API key validation for non-OpenAI providers (DeepSeek, xAI, etc.)
|
|
123
|
+
* Only checks that a key exists and has reasonable format - no OpenAI-specific validation
|
|
124
|
+
*/
|
|
125
|
+
function validateGenericApiKey(apiKey) {
|
|
126
|
+
if (!apiKey || typeof apiKey !== 'string') {
|
|
127
|
+
throw new Error('API key is required and must be a string');
|
|
128
|
+
}
|
|
129
|
+
const trimmed = apiKey.trim();
|
|
130
|
+
if (trimmed.length < 10) {
|
|
131
|
+
throw new Error('API key is too short');
|
|
132
|
+
}
|
|
133
|
+
// Just log that we're using a custom provider key
|
|
134
|
+
const redactedKey = trimmed.length > 8 ? `${trimmed.substring(0, 4)}...${trimmed.substring(trimmed.length - 4)}` : '[REDACTED]';
|
|
135
|
+
logDebug(`[SECURITY] Using custom provider API key (redacted: ${redactedKey})`);
|
|
136
|
+
return trimmed;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Security audit: OpenAI API key validation and protection
|
|
140
|
+
* Enhanced with comprehensive validation and security controls
|
|
141
|
+
*/
|
|
142
|
+
function validateAndProtectApiKey(apiKey) {
|
|
143
|
+
if (!apiKey || typeof apiKey !== 'string') {
|
|
144
|
+
throw new Error('OpenAI API key is required and must be a string');
|
|
145
|
+
}
|
|
146
|
+
// Remove whitespace
|
|
147
|
+
apiKey = apiKey.trim();
|
|
148
|
+
// Comprehensive format validation
|
|
149
|
+
const validation = validateOpenAIKeyFormat(apiKey);
|
|
150
|
+
if (!validation.isValid) {
|
|
151
|
+
throw new Error(`Invalid OpenAI API key: ${validation.reason}`);
|
|
152
|
+
}
|
|
153
|
+
// Security logging (redacted)
|
|
154
|
+
const redactedKey = apiKey.length > 8 ? `${apiKey.substring(0, 8)}...${apiKey.substring(apiKey.length - 4)}` : '[REDACTED]';
|
|
155
|
+
logDebug(`[SECURITY] Using OpenAI API key (type: ${validation.keyType}, redacted: ${redactedKey})`);
|
|
156
|
+
// Check for known revoked/compromised key patterns
|
|
157
|
+
if (isPotentiallyCompromisedKey(apiKey)) {
|
|
158
|
+
console.warn('SECURITY WARNING: API key matches patterns associated with compromised keys. Rotate immediately.');
|
|
159
|
+
}
|
|
160
|
+
return apiKey;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Comprehensive OpenAI key format validation
|
|
164
|
+
*/
|
|
165
|
+
function validateOpenAIKeyFormat(apiKey) {
|
|
166
|
+
// Length validation
|
|
167
|
+
if (apiKey.length < 40 || apiKey.length > 200) {
|
|
168
|
+
return { isValid: false, reason: `Invalid key length: ${apiKey.length} chars (expected 40-200)`, keyType: 'unknown' };
|
|
169
|
+
}
|
|
170
|
+
// Character validation (alphanumeric, dashes, underscores only)
|
|
171
|
+
const validChars = /^[a-zA-Z0-9\-_]+$/;
|
|
172
|
+
if (!validChars.test(apiKey)) {
|
|
173
|
+
return { isValid: false, reason: 'Key contains invalid characters', keyType: 'unknown' };
|
|
174
|
+
}
|
|
175
|
+
// OpenAI key format patterns
|
|
176
|
+
if (apiKey.startsWith('sk-proj-')) {
|
|
177
|
+
// Project key format: sk-proj-xxxxxxxxxxxxxxxxxxxxxxxx
|
|
178
|
+
if (apiKey.length !== 51) {
|
|
179
|
+
return { isValid: false, reason: `Project key should be 51 chars, got ${apiKey.length}`, keyType: 'project' };
|
|
180
|
+
}
|
|
181
|
+
return { isValid: true, keyType: 'project' };
|
|
182
|
+
}
|
|
183
|
+
if (apiKey.startsWith('sk-')) {
|
|
184
|
+
// Standard key format: sk-xxxxxxxxxxxxxxxxxxxxxxxx
|
|
185
|
+
if (apiKey.length !== 51) {
|
|
186
|
+
return { isValid: false, reason: `Standard key should be 51 chars, got ${apiKey.length}`, keyType: 'standard' };
|
|
187
|
+
}
|
|
188
|
+
return { isValid: true, keyType: 'standard' };
|
|
189
|
+
}
|
|
190
|
+
if (apiKey.startsWith('org-')) {
|
|
191
|
+
// Organization key format: org-xxxxxxxxxxxxxxxxxxxxxxxx
|
|
192
|
+
if (apiKey.length < 40 || apiKey.length > 100) {
|
|
193
|
+
return { isValid: false, reason: `Organization key length ${apiKey.length} outside expected range`, keyType: 'organization' };
|
|
194
|
+
}
|
|
195
|
+
return { isValid: true, keyType: 'organization' };
|
|
196
|
+
}
|
|
197
|
+
// Unknown format but might be valid (custom deployments, Azure, etc.)
|
|
198
|
+
console.warn(`Unrecognized OpenAI API key format: ${apiKey.substring(0, 12)}...`);
|
|
199
|
+
return { isValid: true, keyType: 'unknown' };
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Check for patterns associated with compromised keys
|
|
203
|
+
* This checks for known patterns from public leaks and security advisories
|
|
204
|
+
*/
|
|
205
|
+
function isPotentiallyCompromisedKey(apiKey) {
|
|
206
|
+
// Check for patterns from known public leaks
|
|
207
|
+
// These are example patterns - in production, these should come from a threat intelligence feed
|
|
208
|
+
// Example: Keys starting with certain compromised prefixes
|
|
209
|
+
const compromisedPrefixes = [
|
|
210
|
+
'sk-live-', // Example compromised pattern
|
|
211
|
+
'sk-test-', // Test keys that shouldn't be in production
|
|
212
|
+
];
|
|
213
|
+
for (const prefix of compromisedPrefixes) {
|
|
214
|
+
if (apiKey.startsWith(prefix)) {
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// Check for sequential or repeating patterns that might indicate generated/test keys
|
|
219
|
+
const sequentialPattern = /(\d{3,})/;
|
|
220
|
+
const match = sequentialPattern.exec(apiKey);
|
|
221
|
+
if (match) {
|
|
222
|
+
const sequence = match[1];
|
|
223
|
+
// Check if digits are sequential (like 123, 456, etc.)
|
|
224
|
+
if (isSequentialDigits(sequence)) {
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Check if a string of digits is sequential (ascending or descending)
|
|
232
|
+
*/
|
|
233
|
+
function isSequentialDigits(str) {
|
|
234
|
+
if (str.length < 3)
|
|
235
|
+
return false;
|
|
236
|
+
// Check ascending
|
|
237
|
+
let ascending = true;
|
|
238
|
+
for (let i = 1; i < str.length; i++) {
|
|
239
|
+
if (parseInt(str[i]) !== parseInt(str[i - 1]) + 1) {
|
|
240
|
+
ascending = false;
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (ascending)
|
|
245
|
+
return true;
|
|
246
|
+
// Check descending
|
|
247
|
+
let descending = true;
|
|
248
|
+
for (let i = 1; i < str.length; i++) {
|
|
249
|
+
if (parseInt(str[i]) !== parseInt(str[i - 1]) - 1) {
|
|
250
|
+
descending = false;
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return descending;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Check if an error is recoverable (should be retried)
|
|
258
|
+
*/
|
|
259
|
+
function isRecoverableError(error) {
|
|
260
|
+
if (!(error instanceof Error))
|
|
261
|
+
return false;
|
|
262
|
+
const message = error.message.toLowerCase();
|
|
263
|
+
const errorName = error.name?.toLowerCase() ?? '';
|
|
264
|
+
const errorCode = error.code?.toLowerCase() ?? '';
|
|
265
|
+
// Check all sources for recoverable patterns
|
|
266
|
+
const allText = `${message} ${errorName} ${errorCode}`;
|
|
267
|
+
return RECOVERABLE_ERROR_PATTERNS.some(pattern => allText.includes(pattern));
|
|
268
|
+
}
|
|
269
|
+
export class OpenAIChatCompletionsProvider {
|
|
270
|
+
id;
|
|
271
|
+
model;
|
|
272
|
+
client;
|
|
273
|
+
maxRetries;
|
|
274
|
+
temperature;
|
|
275
|
+
maxTokens;
|
|
276
|
+
requestCount = 0;
|
|
277
|
+
lastRequestTime = Date.now();
|
|
278
|
+
constructor(options) {
|
|
279
|
+
// SECURITY: Validate API key - skip OpenAI-specific format checks for custom providers
|
|
280
|
+
const isCustomProvider = !!options.baseURL;
|
|
281
|
+
const validatedApiKey = isCustomProvider
|
|
282
|
+
? validateGenericApiKey(options.apiKey)
|
|
283
|
+
: validateAndProtectApiKey(options.apiKey);
|
|
284
|
+
// SECURITY: Rate limiting check
|
|
285
|
+
if (!globalRateLimiter.isAllowed('openai-provider')) {
|
|
286
|
+
throw new Error('Rate limit exceeded for OpenAI provider. Please wait before making more requests.');
|
|
287
|
+
}
|
|
288
|
+
// SECURITY: Log security event
|
|
289
|
+
securityLogger.logSecurityEvent({
|
|
290
|
+
type: 'openai_provider_initialized',
|
|
291
|
+
command: 'constructor',
|
|
292
|
+
success: true,
|
|
293
|
+
timestamp: new Date(),
|
|
294
|
+
details: {
|
|
295
|
+
model: options.model,
|
|
296
|
+
providerId: options.providerId,
|
|
297
|
+
hasBaseURL: !!options.baseURL
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
const clientConfig = {
|
|
301
|
+
apiKey: validatedApiKey,
|
|
302
|
+
timeout: options.timeout ?? 120000,
|
|
303
|
+
maxRetries: 0, // We handle retries ourselves for better control
|
|
304
|
+
};
|
|
305
|
+
if (options.baseURL) {
|
|
306
|
+
// SECURITY: Enhanced URL validation with domain restrictions
|
|
307
|
+
try {
|
|
308
|
+
clientConfig.baseURL = validateOpenAIBaseURL(options.baseURL);
|
|
309
|
+
logDebug(`[SECURITY] Using validated baseURL: ${clientConfig.baseURL}`);
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
securityLogger.logSecurityEvent({
|
|
313
|
+
type: 'invalid_baseurl',
|
|
314
|
+
command: 'constructor',
|
|
315
|
+
success: false,
|
|
316
|
+
timestamp: new Date(),
|
|
317
|
+
details: { error: error instanceof Error ? error.message : String(error) }
|
|
318
|
+
});
|
|
319
|
+
throw new Error(`Invalid baseURL: ${error instanceof Error ? error.message : String(error)}`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
this.client = new OpenAI(clientConfig);
|
|
323
|
+
this.id = options.providerId ?? 'openai';
|
|
324
|
+
this.model = options.model;
|
|
325
|
+
this.maxRetries = options.maxRetries ?? 3;
|
|
326
|
+
this.temperature = typeof options.temperature === 'number' ? options.temperature : undefined;
|
|
327
|
+
this.maxTokens = Math.max(1, options.maxTokens ?? 4096);
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Sleep for a given number of milliseconds
|
|
331
|
+
*/
|
|
332
|
+
sleep(ms) {
|
|
333
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Calculate exponential backoff delay
|
|
337
|
+
*/
|
|
338
|
+
getBackoffDelay(attempt, baseDelay = 1000, maxDelay = 30000) {
|
|
339
|
+
const delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);
|
|
340
|
+
// Add jitter to prevent thundering herd
|
|
341
|
+
return delay + Math.random() * delay * 0.1;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Execute request with retry logic for transient errors
|
|
345
|
+
*/
|
|
346
|
+
async executeWithRetry(operation, operationName) {
|
|
347
|
+
let lastError;
|
|
348
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
349
|
+
try {
|
|
350
|
+
return await operation();
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
354
|
+
// Check if this is a recoverable error
|
|
355
|
+
if (isRecoverableError(error) && attempt < this.maxRetries) {
|
|
356
|
+
const delay = this.getBackoffDelay(attempt);
|
|
357
|
+
// SECURITY: Sanitize error message to prevent token leakage
|
|
358
|
+
logDebug(`[${this.id}] ${operationName} failed (attempt ${attempt + 1}/${this.maxRetries + 1}): ` +
|
|
359
|
+
`${safeErrorMessage(lastError)}. Retrying in ${Math.round(delay)}ms...`);
|
|
360
|
+
await this.sleep(delay);
|
|
361
|
+
continue;
|
|
362
|
+
}
|
|
363
|
+
// Non-recoverable error or out of retries
|
|
364
|
+
throw new ProviderStreamError(`${operationName} failed after ${attempt + 1} attempts: ${lastError.message}`, this.id, lastError, isRecoverableError(error));
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
// Should not reach here, but TypeScript needs this
|
|
368
|
+
throw lastError;
|
|
369
|
+
}
|
|
370
|
+
async generate(messages, tools) {
|
|
371
|
+
const { messages: boundedMessages } = enforceRequestSizeLimit(messages);
|
|
372
|
+
return this.executeWithRetry(async () => {
|
|
373
|
+
const request = {
|
|
374
|
+
model: this.model,
|
|
375
|
+
messages: mapMessages(boundedMessages, this.model),
|
|
376
|
+
tools: tools.length ? tools.map(mapTool) : undefined,
|
|
377
|
+
// Force tool usage when tools are available - prevents text-only rambling
|
|
378
|
+
tool_choice: tools.length ? 'auto' : undefined,
|
|
379
|
+
// Enable multiple tool calls in a single response
|
|
380
|
+
parallel_tool_calls: tools.length ? true : undefined,
|
|
381
|
+
stream: false,
|
|
382
|
+
// Guardrails: enforce temperature and output cap to prevent runaway responses
|
|
383
|
+
temperature: this.temperature,
|
|
384
|
+
max_tokens: this.maxTokens,
|
|
385
|
+
};
|
|
386
|
+
let completion;
|
|
387
|
+
try {
|
|
388
|
+
const result = await this.client.chat.completions.create(request);
|
|
389
|
+
assertHasChoices(result);
|
|
390
|
+
completion = result;
|
|
391
|
+
}
|
|
392
|
+
catch (error) {
|
|
393
|
+
// Wrap and rethrow with more context
|
|
394
|
+
if (error instanceof Error) {
|
|
395
|
+
// Check for specific API error types
|
|
396
|
+
const apiError = error;
|
|
397
|
+
if (apiError.status === 401) {
|
|
398
|
+
throw new ProviderStreamError(`Authentication failed for ${this.id}. Check your API key.`, this.id, error, false // Not retryable
|
|
399
|
+
);
|
|
400
|
+
}
|
|
401
|
+
if (apiError.status === 403) {
|
|
402
|
+
throw new ProviderStreamError(`Access forbidden for ${this.id}. Check your permissions.`, this.id, error, false // Not retryable
|
|
403
|
+
);
|
|
404
|
+
}
|
|
405
|
+
// Let recoverable errors propagate for retry
|
|
406
|
+
if (isRecoverableError(error)) {
|
|
407
|
+
throw error;
|
|
408
|
+
}
|
|
409
|
+
// Wrap other errors
|
|
410
|
+
throw new ProviderStreamError(`API request failed: ${error.message}`, this.id, error, false);
|
|
411
|
+
}
|
|
412
|
+
throw error;
|
|
413
|
+
}
|
|
414
|
+
const choice = completion.choices[0];
|
|
415
|
+
const usage = mapUsage(completion.usage);
|
|
416
|
+
if (!choice) {
|
|
417
|
+
return {
|
|
418
|
+
type: 'message',
|
|
419
|
+
content: '',
|
|
420
|
+
usage,
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
// Safely extract tool calls with error recovery
|
|
424
|
+
let toolCalls = [];
|
|
425
|
+
try {
|
|
426
|
+
toolCalls = (choice.message.tool_calls ?? []).map(mapToolCall);
|
|
427
|
+
}
|
|
428
|
+
catch (parseError) {
|
|
429
|
+
// SECURITY: Sanitize error message to prevent token leakage
|
|
430
|
+
logDebug(`[${this.id}] Failed to parse tool calls, recovering: ` +
|
|
431
|
+
`${safeErrorMessage(parseError)}`);
|
|
432
|
+
// Continue with empty tool calls rather than failing
|
|
433
|
+
}
|
|
434
|
+
const content = extractMessageContent(choice);
|
|
435
|
+
if (toolCalls.length > 0) {
|
|
436
|
+
return {
|
|
437
|
+
type: 'tool_calls',
|
|
438
|
+
toolCalls,
|
|
439
|
+
content,
|
|
440
|
+
usage,
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
return {
|
|
444
|
+
type: 'message',
|
|
445
|
+
content,
|
|
446
|
+
usage,
|
|
447
|
+
};
|
|
448
|
+
}, 'generate');
|
|
449
|
+
}
|
|
450
|
+
async *generateStream(messages, tools) {
|
|
451
|
+
const { messages: boundedMessages } = enforceRequestSizeLimit(messages);
|
|
452
|
+
const request = {
|
|
453
|
+
model: this.model,
|
|
454
|
+
messages: mapMessages(boundedMessages, this.model),
|
|
455
|
+
tools: tools.length ? tools.map(mapTool) : undefined,
|
|
456
|
+
// Force tool usage when tools are available - prevents text-only rambling
|
|
457
|
+
tool_choice: tools.length ? 'auto' : undefined,
|
|
458
|
+
// Enable multiple tool calls in a single response
|
|
459
|
+
parallel_tool_calls: tools.length ? true : undefined,
|
|
460
|
+
stream: true,
|
|
461
|
+
// Guardrails: enforce temperature and output cap to prevent runaway responses
|
|
462
|
+
temperature: this.temperature,
|
|
463
|
+
max_tokens: this.maxTokens,
|
|
464
|
+
};
|
|
465
|
+
const response = await this.client.chat.completions.create(request);
|
|
466
|
+
// TypeScript needs help knowing this is a stream when stream: true
|
|
467
|
+
if (!Symbol.asyncIterator || !(response[Symbol.asyncIterator])) {
|
|
468
|
+
throw new Error('Expected streaming response but got non-streaming');
|
|
469
|
+
}
|
|
470
|
+
const stream = response;
|
|
471
|
+
// Track tool calls being built (by index)
|
|
472
|
+
const pendingToolCalls = new Map();
|
|
473
|
+
for await (const chunk of stream) {
|
|
474
|
+
const choice = chunk.choices[0];
|
|
475
|
+
if (!choice)
|
|
476
|
+
continue;
|
|
477
|
+
const delta = choice.delta;
|
|
478
|
+
// Stream reasoning_content for models like deepseek-reasoner so users see progress
|
|
479
|
+
const reasoning = extractTextContent(delta['reasoning_content']);
|
|
480
|
+
if (reasoning) {
|
|
481
|
+
yield { type: 'reasoning', content: reasoning };
|
|
482
|
+
}
|
|
483
|
+
// Handle content chunks (support both string and array formats)
|
|
484
|
+
const content = extractTextContent(delta['content']);
|
|
485
|
+
if (content) {
|
|
486
|
+
yield { type: 'content', content };
|
|
487
|
+
}
|
|
488
|
+
// Handle tool call deltas
|
|
489
|
+
const toolCalls = delta['tool_calls'];
|
|
490
|
+
if (toolCalls) {
|
|
491
|
+
for (const toolCallDelta of toolCalls) {
|
|
492
|
+
const idx = toolCallDelta.index;
|
|
493
|
+
if (!pendingToolCalls.has(idx)) {
|
|
494
|
+
pendingToolCalls.set(idx, {
|
|
495
|
+
id: toolCallDelta.id ?? `call_${idx}`,
|
|
496
|
+
name: toolCallDelta.function?.name ?? '',
|
|
497
|
+
arguments: '',
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
const pending = pendingToolCalls.get(idx);
|
|
501
|
+
// Accumulate function name if provided
|
|
502
|
+
if (toolCallDelta.function?.name) {
|
|
503
|
+
pending.name = toolCallDelta.function.name;
|
|
504
|
+
}
|
|
505
|
+
// Accumulate arguments with size limit
|
|
506
|
+
if (toolCallDelta.function?.arguments) {
|
|
507
|
+
// SECURITY: Limit accumulated arguments size to prevent memory DoS
|
|
508
|
+
if (pending.arguments.length + toolCallDelta.function.arguments.length > 100000) {
|
|
509
|
+
throw new Error(`Tool call arguments too large (${pending.arguments.length + toolCallDelta.function.arguments.length} bytes), maximum is 100KB`);
|
|
510
|
+
}
|
|
511
|
+
pending.arguments += toolCallDelta.function.arguments;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
// Check if stream is done
|
|
516
|
+
if (choice.finish_reason) {
|
|
517
|
+
// Emit all accumulated tool calls
|
|
518
|
+
for (const [, toolCall] of pendingToolCalls) {
|
|
519
|
+
let parsed = {};
|
|
520
|
+
try {
|
|
521
|
+
// SECURITY: Use safe JSON parsing with prototype pollution protection
|
|
522
|
+
parsed = safeJSONParse(toolCall.arguments || '{}', {
|
|
523
|
+
maxDepth: 10,
|
|
524
|
+
maxProperties: 100
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
catch (parseError) {
|
|
528
|
+
// Try recovery for malformed JSON
|
|
529
|
+
const recovered = tryRecoverMalformedJson(toolCall.arguments);
|
|
530
|
+
if (recovered) {
|
|
531
|
+
parsed = recovered;
|
|
532
|
+
}
|
|
533
|
+
else {
|
|
534
|
+
logDebug(`[SECURITY] Failed to parse tool call arguments: ${safeErrorMessage(parseError)}`);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
yield {
|
|
538
|
+
type: 'tool_call',
|
|
539
|
+
toolCall: {
|
|
540
|
+
id: toolCall.id,
|
|
541
|
+
name: toolCall.name,
|
|
542
|
+
arguments: parsed,
|
|
543
|
+
},
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
// Emit usage if available
|
|
547
|
+
if ('usage' in chunk && chunk.usage) {
|
|
548
|
+
const usage = chunk.usage;
|
|
549
|
+
yield {
|
|
550
|
+
type: 'usage',
|
|
551
|
+
usage: {
|
|
552
|
+
inputTokens: usage.prompt_tokens,
|
|
553
|
+
outputTokens: usage.completion_tokens,
|
|
554
|
+
totalTokens: usage.total_tokens,
|
|
555
|
+
},
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
yield { type: 'done' };
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
cachedModelInfo = null;
|
|
563
|
+
/**
|
|
564
|
+
* Fetch model info from OpenAI API
|
|
565
|
+
* Returns context window and token limits from the real API
|
|
566
|
+
*/
|
|
567
|
+
async getModelInfo() {
|
|
568
|
+
if (this.cachedModelInfo) {
|
|
569
|
+
return this.cachedModelInfo;
|
|
570
|
+
}
|
|
571
|
+
try {
|
|
572
|
+
// Use the OpenAI models API to get real model info
|
|
573
|
+
const modelInfo = await this.client.models.retrieve(this.model);
|
|
574
|
+
if (modelInfo) {
|
|
575
|
+
// OpenAI models API returns context_length or similar field
|
|
576
|
+
// The exact field name may vary by model
|
|
577
|
+
const rawInfo = modelInfo;
|
|
578
|
+
const contextWindow = rawInfo['context_length'] ??
|
|
579
|
+
rawInfo['context_window'] ??
|
|
580
|
+
rawInfo['max_context_length'];
|
|
581
|
+
const maxOutputTokens = rawInfo['max_output_tokens'] ??
|
|
582
|
+
rawInfo['output_token_limit'];
|
|
583
|
+
if (contextWindow) {
|
|
584
|
+
this.cachedModelInfo = {
|
|
585
|
+
id: this.model,
|
|
586
|
+
contextWindow,
|
|
587
|
+
maxOutputTokens,
|
|
588
|
+
inputTokenLimit: contextWindow,
|
|
589
|
+
outputTokenLimit: maxOutputTokens,
|
|
590
|
+
};
|
|
591
|
+
return this.cachedModelInfo;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
catch (error) {
|
|
596
|
+
// Models API may not be available for all models
|
|
597
|
+
// Fall through to return null
|
|
598
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
599
|
+
if (!message.includes('404') && !message.includes('not found')) {
|
|
600
|
+
// Log unexpected errors but don't fail
|
|
601
|
+
logDebug(`Failed to fetch model info for ${this.model}:`, message);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
return null;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
function isDeepSeekModel(model) {
|
|
608
|
+
if (!model)
|
|
609
|
+
return false;
|
|
610
|
+
const normalized = model.toLowerCase();
|
|
611
|
+
return normalized.includes('deepseek');
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Check if a model is a Grok model that may output reasoning content
|
|
615
|
+
* Grok 3+, Grok 4, and variants with "think" or "reasoning" support chain-of-thought
|
|
616
|
+
*/
|
|
617
|
+
function isGrokModel(model) {
|
|
618
|
+
if (!model)
|
|
619
|
+
return false;
|
|
620
|
+
const normalized = model.toLowerCase();
|
|
621
|
+
return (normalized.includes('grok') &&
|
|
622
|
+
(normalized.includes('think') ||
|
|
623
|
+
normalized.includes('reason') ||
|
|
624
|
+
normalized.includes('grok-3') ||
|
|
625
|
+
normalized.includes('grok-4')));
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Check if a model is a local reasoning model (via Ollama)
|
|
629
|
+
* QwQ, Qwen reasoning, Llama reasoning variants, etc.
|
|
630
|
+
*/
|
|
631
|
+
function isLocalReasoningModel(model) {
|
|
632
|
+
if (!model)
|
|
633
|
+
return false;
|
|
634
|
+
const normalized = model.toLowerCase();
|
|
635
|
+
return (
|
|
636
|
+
// QwQ is Alibaba's reasoning model
|
|
637
|
+
normalized.includes('qwq') ||
|
|
638
|
+
// Qwen with reasoning
|
|
639
|
+
(normalized.includes('qwen') && normalized.includes('reason')) ||
|
|
640
|
+
// Llama reasoning variants
|
|
641
|
+
(normalized.includes('llama') && normalized.includes('reason')) ||
|
|
642
|
+
// Mistral reasoning
|
|
643
|
+
(normalized.includes('mistral') && normalized.includes('reason')) ||
|
|
644
|
+
// Generic reasoning model indicators
|
|
645
|
+
normalized.includes('-r1') ||
|
|
646
|
+
normalized.includes('think') ||
|
|
647
|
+
normalized.includes('cot'));
|
|
648
|
+
}
|
|
649
|
+
/**
|
|
650
|
+
* Check if a model supports reasoning/thinking content in responses
|
|
651
|
+
*/
|
|
652
|
+
function supportsReasoningContent(model) {
|
|
653
|
+
return isDeepSeekModel(model) || isGrokModel(model) || isLocalReasoningModel(model);
|
|
654
|
+
}
|
|
655
|
+
/**
|
|
656
|
+
* Validate and sanitize message sequence to ensure tool messages have preceding tool_calls.
|
|
657
|
+
* OpenAI/DeepSeek APIs require: "Messages with role 'tool' must be a response to a preceding message with 'tool_calls'"
|
|
658
|
+
*/
|
|
659
|
+
function sanitizeMessageSequence(messages) {
|
|
660
|
+
const sanitized = [];
|
|
661
|
+
const pendingToolCallIds = new Set();
|
|
662
|
+
for (const message of messages) {
|
|
663
|
+
if (message.role === 'assistant' && message.toolCalls?.length) {
|
|
664
|
+
// Track tool call IDs that need responses
|
|
665
|
+
for (const tc of message.toolCalls) {
|
|
666
|
+
if (tc.id)
|
|
667
|
+
pendingToolCallIds.add(tc.id);
|
|
668
|
+
}
|
|
669
|
+
sanitized.push(message);
|
|
670
|
+
}
|
|
671
|
+
else if (message.role === 'tool') {
|
|
672
|
+
// Only include tool messages if we have a pending tool call for them
|
|
673
|
+
const toolCallId = message.toolCallId;
|
|
674
|
+
if (toolCallId && pendingToolCallIds.has(toolCallId)) {
|
|
675
|
+
pendingToolCallIds.delete(toolCallId);
|
|
676
|
+
sanitized.push(message);
|
|
677
|
+
}
|
|
678
|
+
else {
|
|
679
|
+
// ORPHANED TOOL MESSAGE - skip it to prevent API error
|
|
680
|
+
// This can happen after context compaction or message pruning
|
|
681
|
+
logDebug(`[mapMessages] Skipping orphaned tool message (no preceding tool_call): ${toolCallId?.slice(0, 20) || 'no-id'}`);
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
else {
|
|
685
|
+
// system, user, assistant without tool_calls - pass through
|
|
686
|
+
// Clear pending tool calls when we hit a user message (new turn)
|
|
687
|
+
if (message.role === 'user') {
|
|
688
|
+
pendingToolCallIds.clear();
|
|
689
|
+
}
|
|
690
|
+
sanitized.push(message);
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
return sanitized;
|
|
694
|
+
}
|
|
695
|
+
function mapMessages(messages, model) {
|
|
696
|
+
// CRITICAL: Sanitize message sequence to prevent "tool must follow tool_calls" errors
|
|
697
|
+
const sanitizedMessages = sanitizeMessageSequence(messages);
|
|
698
|
+
const params = [];
|
|
699
|
+
const includeReasoningContent = supportsReasoningContent(model);
|
|
700
|
+
for (const message of sanitizedMessages) {
|
|
701
|
+
switch (message.role) {
|
|
702
|
+
case 'system':
|
|
703
|
+
case 'user': {
|
|
704
|
+
params.push({
|
|
705
|
+
role: message.role,
|
|
706
|
+
content: message.content,
|
|
707
|
+
});
|
|
708
|
+
break;
|
|
709
|
+
}
|
|
710
|
+
case 'assistant': {
|
|
711
|
+
const assistantMessage = {
|
|
712
|
+
role: 'assistant',
|
|
713
|
+
content: message.content,
|
|
714
|
+
tool_calls: message.toolCalls?.map((call, index) => ({
|
|
715
|
+
id: call.id || `call_${index}`,
|
|
716
|
+
type: 'function',
|
|
717
|
+
function: {
|
|
718
|
+
name: call.name,
|
|
719
|
+
arguments: JSON.stringify(call.arguments ?? {}),
|
|
720
|
+
},
|
|
721
|
+
})),
|
|
722
|
+
};
|
|
723
|
+
if (includeReasoningContent) {
|
|
724
|
+
assistantMessage.reasoning_content = message.content ?? '';
|
|
725
|
+
}
|
|
726
|
+
params.push(assistantMessage);
|
|
727
|
+
break;
|
|
728
|
+
}
|
|
729
|
+
case 'tool': {
|
|
730
|
+
params.push({
|
|
731
|
+
role: 'tool',
|
|
732
|
+
content: message.content,
|
|
733
|
+
tool_call_id: message.toolCallId,
|
|
734
|
+
});
|
|
735
|
+
break;
|
|
736
|
+
}
|
|
737
|
+
default:
|
|
738
|
+
break;
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
return params;
|
|
742
|
+
}
|
|
743
|
+
function mapTool(definition) {
|
|
744
|
+
const parameters = (definition.parameters ?? {
|
|
745
|
+
type: 'object',
|
|
746
|
+
properties: {},
|
|
747
|
+
});
|
|
748
|
+
return {
|
|
749
|
+
type: 'function',
|
|
750
|
+
function: {
|
|
751
|
+
name: definition.name,
|
|
752
|
+
description: definition.description,
|
|
753
|
+
parameters,
|
|
754
|
+
// Enable strict schema validation for more reliable tool calls
|
|
755
|
+
strict: false, // Set to false to allow flexible schemas; true requires additionalProperties: false
|
|
756
|
+
},
|
|
757
|
+
};
|
|
758
|
+
}
|
|
759
|
+
/**
|
|
760
|
+
* Enforce a hard request size limit to prevent provider 413 errors.
|
|
761
|
+
* Drops the oldest non-system messages until the serialized size is under limit.
|
|
762
|
+
*/
|
|
763
|
+
function enforceRequestSizeLimit(messages) {
|
|
764
|
+
let truncated = false;
|
|
765
|
+
const trimmed = [...messages];
|
|
766
|
+
let size = estimateMessageChars(trimmed);
|
|
767
|
+
while (size > REQUEST_CHAR_LIMIT && trimmed.length > 1) {
|
|
768
|
+
// Remove the oldest non-system message; if only systems remain, drop the second message
|
|
769
|
+
const removeIdx = trimmed.findIndex(msg => msg.role !== 'system');
|
|
770
|
+
const idx = removeIdx === -1 ? 1 : removeIdx;
|
|
771
|
+
trimmed.splice(idx, 1);
|
|
772
|
+
truncated = true;
|
|
773
|
+
size = estimateMessageChars(trimmed);
|
|
774
|
+
}
|
|
775
|
+
if (truncated) {
|
|
776
|
+
trimmed.unshift({
|
|
777
|
+
role: 'system',
|
|
778
|
+
content: '[Context trimmed to fit request size limit. Earlier turns were dropped to avoid provider rejection.]',
|
|
779
|
+
});
|
|
780
|
+
}
|
|
781
|
+
return { messages: trimmed, truncated };
|
|
782
|
+
}
|
|
783
|
+
function estimateMessageChars(messages) {
|
|
784
|
+
let total = 0;
|
|
785
|
+
for (const msg of messages) {
|
|
786
|
+
if (typeof msg.content === 'string') {
|
|
787
|
+
total += msg.content.length;
|
|
788
|
+
}
|
|
789
|
+
else if (Array.isArray(msg.content)) {
|
|
790
|
+
for (const part of msg.content) {
|
|
791
|
+
if (typeof part === 'string') {
|
|
792
|
+
total += part.length;
|
|
793
|
+
}
|
|
794
|
+
else if (part && typeof part === 'object' && 'text' in part) {
|
|
795
|
+
const text = part.text ?? '';
|
|
796
|
+
total += typeof text === 'string' ? text.length : String(text).length;
|
|
797
|
+
}
|
|
798
|
+
else {
|
|
799
|
+
total += JSON.stringify(part ?? '').length;
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
else if (msg.content != null) {
|
|
804
|
+
total += JSON.stringify(msg.content).length;
|
|
805
|
+
}
|
|
806
|
+
const toolCalls = msg.toolCalls;
|
|
807
|
+
if (Array.isArray(toolCalls)) {
|
|
808
|
+
for (const call of toolCalls) {
|
|
809
|
+
total += (call.name?.length ?? 0);
|
|
810
|
+
try {
|
|
811
|
+
total += JSON.stringify(call.arguments ?? {}).length;
|
|
812
|
+
}
|
|
813
|
+
catch {
|
|
814
|
+
total += 100; // Fallback small cost
|
|
815
|
+
}
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
return total;
|
|
820
|
+
}
|
|
821
|
+
function extractMessageContent(choice) {
|
|
822
|
+
const message = choice.message;
|
|
823
|
+
const content = extractTextContent(message?.content);
|
|
824
|
+
if (content.trim()) {
|
|
825
|
+
return content.trim();
|
|
826
|
+
}
|
|
827
|
+
const reasoning = extractTextContent(message?.reasoning_content);
|
|
828
|
+
if (reasoning.trim()) {
|
|
829
|
+
return reasoning.trim();
|
|
830
|
+
}
|
|
831
|
+
const refusal = message?.refusal;
|
|
832
|
+
if (typeof refusal === 'string' && refusal.trim()) {
|
|
833
|
+
return refusal.trim();
|
|
834
|
+
}
|
|
835
|
+
return '';
|
|
836
|
+
}
|
|
837
|
+
function isFunctionToolCall(call) {
|
|
838
|
+
return call.type === 'function';
|
|
839
|
+
}
|
|
840
|
+
function isCustomToolCall(call) {
|
|
841
|
+
return call.type === 'custom';
|
|
842
|
+
}
|
|
843
|
+
function mapToolCall(call) {
|
|
844
|
+
let parsed = {};
|
|
845
|
+
let rawArgs;
|
|
846
|
+
let funcName;
|
|
847
|
+
// Handle both standard function calls and custom tool calls
|
|
848
|
+
if (isFunctionToolCall(call)) {
|
|
849
|
+
rawArgs = call.function.arguments ?? '{}';
|
|
850
|
+
funcName = call.function.name ?? call.id ?? 'unknown';
|
|
851
|
+
}
|
|
852
|
+
else if (isCustomToolCall(call)) {
|
|
853
|
+
rawArgs = call.custom.input ?? '{}';
|
|
854
|
+
funcName = call.custom.name ?? call.id ?? 'unknown';
|
|
855
|
+
}
|
|
856
|
+
else {
|
|
857
|
+
// Fallback for any future tool call types
|
|
858
|
+
rawArgs = '{}';
|
|
859
|
+
funcName = call.id ?? 'unknown';
|
|
860
|
+
}
|
|
861
|
+
try {
|
|
862
|
+
// SECURITY: Validate JSON size before parsing to prevent DoS attacks
|
|
863
|
+
if (rawArgs.length > 100000) {
|
|
864
|
+
throw new Error(`JSON too large (${rawArgs.length} bytes), maximum is 100KB`);
|
|
865
|
+
}
|
|
866
|
+
// SECURITY: Check for potential malicious patterns before parsing
|
|
867
|
+
if (rawArgs.includes('__proto__') || rawArgs.includes('constructor') || rawArgs.includes('prototype')) {
|
|
868
|
+
logDebug(`[security] Suspicious pattern detected in tool call arguments for ${funcName}`);
|
|
869
|
+
}
|
|
870
|
+
// SECURITY: Use safe JSON parsing instead of plain JSON.parse
|
|
871
|
+
parsed = safeJSONParse(rawArgs, {
|
|
872
|
+
maxDepth: 15,
|
|
873
|
+
maxProperties: 500
|
|
874
|
+
});
|
|
875
|
+
}
|
|
876
|
+
catch (error) {
|
|
877
|
+
// Try to recover malformed JSON (common with some models)
|
|
878
|
+
const recovered = tryRecoverMalformedJson(rawArgs);
|
|
879
|
+
if (recovered) {
|
|
880
|
+
parsed = recovered;
|
|
881
|
+
}
|
|
882
|
+
else {
|
|
883
|
+
// SECURITY: Sanitize raw args to prevent token leakage (they could contain API keys in malformed requests)
|
|
884
|
+
const sanitizedArgs = sanitizeErrorMessage(rawArgs.slice(0, 100));
|
|
885
|
+
logDebug(`[tool-call] Failed to parse arguments for ${funcName}: ${sanitizedArgs}...`);
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
return {
|
|
889
|
+
id: call.id ?? funcName,
|
|
890
|
+
name: funcName,
|
|
891
|
+
arguments: parsed,
|
|
892
|
+
};
|
|
893
|
+
}
|
|
894
|
+
/**
|
|
895
|
+
* Try to recover malformed JSON from tool call arguments.
|
|
896
|
+
* Some models return truncated or malformed JSON that can be fixed.
|
|
897
|
+
*/
|
|
898
|
+
function tryRecoverMalformedJson(raw) {
|
|
899
|
+
if (!raw || !raw.trim()) {
|
|
900
|
+
return null;
|
|
901
|
+
}
|
|
902
|
+
const attempts = [
|
|
903
|
+
// Try adding missing closing braces/quotes
|
|
904
|
+
`${raw}"}`,
|
|
905
|
+
`${raw}}`,
|
|
906
|
+
`${raw}"` + `}`,
|
|
907
|
+
`${raw}"}}`,
|
|
908
|
+
`${raw}}}`,
|
|
909
|
+
];
|
|
910
|
+
for (const attempt of attempts) {
|
|
911
|
+
try {
|
|
912
|
+
const parsed = JSON.parse(attempt);
|
|
913
|
+
if (typeof parsed === 'object' && parsed !== null) {
|
|
914
|
+
return parsed;
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
catch {
|
|
918
|
+
// Continue to next attempt
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
// Try regex extraction as last resort
|
|
922
|
+
try {
|
|
923
|
+
const pairs = raw.matchAll(/"([^"]+)":\s*(?:"([^"]*)"?|(\d+(?:\.\d+)?)|(\btrue\b|\bfalse\b|\bnull\b))/g);
|
|
924
|
+
const result = {};
|
|
925
|
+
for (const match of pairs) {
|
|
926
|
+
const [, key, strVal, numVal, boolVal] = match;
|
|
927
|
+
if (key) {
|
|
928
|
+
if (strVal !== undefined) {
|
|
929
|
+
result[key] = strVal;
|
|
930
|
+
}
|
|
931
|
+
else if (numVal) {
|
|
932
|
+
result[key] = numVal.includes('.') ? parseFloat(numVal) : parseInt(numVal, 10);
|
|
933
|
+
}
|
|
934
|
+
else if (boolVal) {
|
|
935
|
+
result[key] = boolVal === 'true' ? true : boolVal === 'false' ? false : null;
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
if (Object.keys(result).length > 0) {
|
|
940
|
+
return result;
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
catch {
|
|
944
|
+
// Regex extraction failed
|
|
945
|
+
}
|
|
946
|
+
return null;
|
|
947
|
+
}
|
|
948
|
+
/**
|
|
949
|
+
* Normalize OpenAI content parts into plain text.
|
|
950
|
+
* Supports both legacy string content and the newer array-of-parts format.
|
|
951
|
+
*/
|
|
952
|
+
function extractTextContent(content) {
|
|
953
|
+
if (!content) {
|
|
954
|
+
return '';
|
|
955
|
+
}
|
|
956
|
+
if (typeof content === 'string') {
|
|
957
|
+
return content;
|
|
958
|
+
}
|
|
959
|
+
if (Array.isArray(content)) {
|
|
960
|
+
return content
|
|
961
|
+
.map((part) => {
|
|
962
|
+
if (typeof part === 'string') {
|
|
963
|
+
return part;
|
|
964
|
+
}
|
|
965
|
+
if (part && typeof part === 'object') {
|
|
966
|
+
const { text, content: nestedContent } = part;
|
|
967
|
+
if (typeof text === 'string')
|
|
968
|
+
return text;
|
|
969
|
+
if (typeof nestedContent === 'string')
|
|
970
|
+
return nestedContent;
|
|
971
|
+
}
|
|
972
|
+
return '';
|
|
973
|
+
})
|
|
974
|
+
.join('');
|
|
975
|
+
}
|
|
976
|
+
if (content && typeof content === 'object') {
|
|
977
|
+
const { text, content: nestedContent } = content;
|
|
978
|
+
if (typeof text === 'string')
|
|
979
|
+
return text;
|
|
980
|
+
if (typeof nestedContent === 'string')
|
|
981
|
+
return nestedContent;
|
|
982
|
+
}
|
|
983
|
+
return '';
|
|
984
|
+
}
|
|
985
|
+
function mapUsage(usage) {
|
|
986
|
+
if (!usage) {
|
|
987
|
+
return null;
|
|
988
|
+
}
|
|
989
|
+
return {
|
|
990
|
+
inputTokens: usage.prompt_tokens,
|
|
991
|
+
outputTokens: usage.completion_tokens,
|
|
992
|
+
totalTokens: usage.total_tokens,
|
|
993
|
+
};
|
|
994
|
+
}
|
|
995
|
+
function assertHasChoices(result) {
|
|
996
|
+
if (!('choices' in result)) {
|
|
997
|
+
throw new Error('Streaming responses are not supported in this runtime.');
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
//# sourceMappingURL=openaiChatCompletionsProvider.js.map
|