@iaforged/context-code 2.1.7 → 2.2.4
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/dist/src/Task.js +1 -1
- package/dist/src/commands/login/login.js +1 -1
- package/dist/src/components/ConsoleOAuthFlow.js +1 -1
- package/dist/src/constants/oauth.js +1 -1
- package/dist/src/context/mailbox.js +1 -1
- package/dist/src/context/voice.js +1 -1
- package/dist/src/hooks/useTerminalSize.js +1 -1
- package/dist/src/ink/Ansi.js +1 -1
- package/dist/src/ink/clearTerminal.js +1 -1
- package/dist/src/ink/colorize.js +1 -1
- package/dist/src/ink/components/App.js +1 -1
- package/dist/src/ink/components/Button.js +1 -1
- package/dist/src/ink/components/ClockContext.js +1 -1
- package/dist/src/ink/components/CursorDeclarationContext.js +1 -1
- package/dist/src/ink/components/Link.js +1 -1
- package/dist/src/ink/components/StdinContext.js +1 -1
- package/dist/src/ink/components/TerminalFocusContext.js +1 -1
- package/dist/src/ink/dom.js +1 -1
- package/dist/src/ink/events/keyboard-event.js +1 -1
- package/dist/src/ink/hit-test.js +1 -1
- package/dist/src/ink/hooks/use-animation-frame.js +1 -1
- package/dist/src/ink/hooks/use-app.js +1 -1
- package/dist/src/ink/hooks/use-input.js +1 -1
- package/dist/src/ink/hooks/use-interval.js +1 -1
- package/dist/src/ink/hooks/use-selection.js +1 -1
- package/dist/src/ink/hooks/use-tab-status.js +1 -1
- package/dist/src/ink/hooks/use-terminal-focus.js +1 -1
- package/dist/src/ink/hooks/use-terminal-title.js +1 -1
- package/dist/src/ink/hooks/use-terminal-viewport.js +1 -1
- package/dist/src/ink/ink.js +1 -1
- package/dist/src/ink/layout/yoga.js +1 -1
- package/dist/src/ink/line-width-cache.js +1 -1
- package/dist/src/ink/log-update.js +1 -1
- package/dist/src/ink/measure-text.js +1 -1
- package/dist/src/ink/output.js +1 -1
- package/dist/src/ink/parse-keypress.js +1 -1
- package/dist/src/ink/reconciler.js +1 -1
- package/dist/src/ink/render-border.js +1 -1
- package/dist/src/ink/render-node-to-output.js +1 -1
- package/dist/src/ink/render-to-screen.js +1 -1
- package/dist/src/ink/renderer.js +1 -1
- package/dist/src/ink/root.js +1 -1
- package/dist/src/ink/screen.js +1 -1
- package/dist/src/ink/searchHighlight.js +1 -1
- package/dist/src/ink/selection.js +1 -1
- package/dist/src/ink/squash-text-nodes.js +1 -1
- package/dist/src/ink/stringWidth.js +1 -1
- package/dist/src/ink/tabstops.js +1 -1
- package/dist/src/ink/terminal.js +1 -1
- package/dist/src/ink/termio/osc.js +1 -1
- package/dist/src/ink/termio/parser.js +1 -1
- package/dist/src/ink/termio/tokenize.js +1 -1
- package/dist/src/ink/useTerminalNotification.js +1 -1
- package/dist/src/ink/warn.js +1 -1
- package/dist/src/ink/widest-line.js +1 -1
- package/dist/src/ink/wrap-text.js +1 -1
- package/dist/src/ink/wrapAnsi.js +1 -1
- package/dist/src/native-ts/yoga-layout/index.js +1 -1
- package/dist/src/schemas/hooks.js +1 -1
- package/dist/src/services/SessionMemory/sessionMemoryUtils.js +1 -1
- package/dist/src/services/api/client.js +1 -1
- package/dist/src/services/api/dumpPrompts.js +1 -1
- package/dist/src/services/api/errorUtils.js +1 -1
- package/dist/src/services/api/promptCacheBreakDetection.js +1 -1
- package/dist/src/services/api/withRetry.js +1 -1
- package/dist/src/services/autoDream/consolidationLock.js +1 -1
- package/dist/src/services/mcp/elicitationHandler.js +1 -1
- package/dist/src/services/mcp/mcpStringUtils.js +1 -1
- package/dist/src/services/mcp/oauthPort.js +1 -1
- package/dist/src/services/mcp/vscodeSdkMcp.js +1 -1
- package/dist/src/services/oauth/client.js +1 -1
- package/dist/src/services/oauth/getOauthProfile.js +1 -1
- package/dist/src/services/objetivo/types.js +1 -1
- package/dist/src/services/rateLimitMocking.js +1 -1
- package/dist/src/services/remoteManagedSettings/syncCacheState.js +1 -1
- package/dist/src/skills/bundledSkills.js +1 -1
- package/dist/src/tasks/DreamTask/DreamTask.js +1 -1
- package/dist/src/tools/AgentTool/agentMemory.js +1 -1
- package/dist/src/tools/AgentTool/forkSubagent.js +1 -1
- package/dist/src/tools/BashTool/BashToolResultMessage.js +1 -1
- package/dist/src/tools/BashTool/UI.js +1 -1
- package/dist/src/tools/BashTool/sedEditParser.js +1 -1
- package/dist/src/tools/BashTool/utils.js +1 -1
- package/dist/src/tools/FileReadTool/imageProcessor.js +1 -1
- package/dist/src/tools/FileReadTool/prompt.js +1 -1
- package/dist/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +1 -1
- package/dist/src/tools/ListMcpResourcesTool/UI.js +1 -1
- package/dist/src/tools/MCPTool/MCPTool.js +1 -1
- package/dist/src/tools/MCPTool/UI.js +1 -1
- package/dist/src/tools/McpAuthTool/McpAuthTool.js +1 -1
- package/dist/src/tools/NotebookEditTool/prompt.js +1 -1
- package/dist/src/tools/PowerShellTool/PowerShellTool.js +1 -1
- package/dist/src/tools/PowerShellTool/UI.js +1 -1
- package/dist/src/tools/PowerShellTool/gitSafety.js +1 -1
- package/dist/src/tools/PowerShellTool/modeValidation.js +1 -1
- package/dist/src/tools/PowerShellTool/pathValidation.js +1 -1
- package/dist/src/tools/PowerShellTool/powershellPermissions.js +1 -1
- package/dist/src/tools/PowerShellTool/powershellSecurity.js +1 -1
- package/dist/src/tools/PowerShellTool/prompt.js +1 -1
- package/dist/src/tools/PowerShellTool/readOnlyValidation.js +1 -1
- package/dist/src/tools/REPLTool/constants.js +1 -1
- package/dist/src/tools/REPLTool/primitiveTools.js +1 -1
- package/dist/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +1 -1
- package/dist/src/tools/ReadMcpResourceTool/UI.js +1 -1
- package/dist/src/tools/ScheduleCronTool/prompt.js +1 -1
- package/dist/src/tools/SkillTool/prompt.js +1 -1
- package/dist/src/tools/TodoWriteTool/TodoWriteTool.js +1 -1
- package/dist/src/tools/ToolSearchTool/prompt.js +1 -1
- package/dist/src/tools/WebSearchTool/prompt.js +1 -1
- package/dist/src/tools/shared/gitOperationTracking.js +1 -1
- package/dist/src/types/permissions.js +1 -1
- package/dist/src/utils/Cursor.js +1 -1
- package/dist/src/utils/QueryGuard.js +1 -1
- package/dist/src/utils/Shell.js +1 -1
- package/dist/src/utils/ShellCommand.js +1 -1
- package/dist/src/utils/activityManager.js +1 -1
- package/dist/src/utils/advisor.js +1 -1
- package/dist/src/utils/appleTerminalBackup.js +1 -1
- package/dist/src/utils/argumentSubstitution.js +1 -1
- package/dist/src/utils/authFileDescriptor.js +1 -1
- package/dist/src/utils/autoUpdater.js +1 -1
- package/dist/src/utils/background/remote/preconditions.js +1 -1
- package/dist/src/utils/background/remote/remoteSession.js +1 -1
- package/dist/src/utils/bash/ShellSnapshot.js +1 -1
- package/dist/src/utils/bash/ast.js +1 -1
- package/dist/src/utils/bash/bashParser.js +1 -1
- package/dist/src/utils/bash/bashPipeCommand.js +1 -1
- package/dist/src/utils/bash/parser.js +1 -1
- package/dist/src/utils/bash/shellQuote.js +1 -1
- package/dist/src/utils/bash/shellQuoting.js +1 -1
- package/dist/src/utils/billing.js +1 -1
- package/dist/src/utils/caCerts.js +1 -1
- package/dist/src/utils/claudeInChrome/common.js +1 -1
- package/dist/src/utils/claudeInChrome/setupPortable.js +1 -1
- package/dist/src/utils/claudemd.js +1 -1
- package/dist/src/utils/collapseBackgroundBashNotifications.js +1 -1
- package/dist/src/utils/collapseReadSearch.js +1 -1
- package/dist/src/utils/completionCache.js +1 -1
- package/dist/src/utils/computerUse/common.js +1 -1
- package/dist/src/utils/concurrentSessions.js +1 -1
- package/dist/src/utils/context.js +1 -1
- package/dist/src/utils/cron.js +1 -1
- package/dist/src/utils/cronTasks.js +1 -1
- package/dist/src/utils/cwd.js +1 -1
- package/dist/src/utils/debug.js +1 -1
- package/dist/src/utils/debugFilter.js +1 -1
- package/dist/src/utils/detectRepository.js +1 -1
- package/dist/src/utils/diagLogs.js +1 -1
- package/dist/src/utils/diff.js +1 -1
- package/dist/src/utils/directMemberMessage.js +1 -1
- package/dist/src/utils/doctorDiagnostic.js +1 -1
- package/dist/src/utils/dxt/helpers.js +1 -1
- package/dist/src/utils/dxt/zip.js +1 -1
- package/dist/src/utils/earlyInput.js +1 -1
- package/dist/src/utils/editor.js +1 -1
- package/dist/src/utils/effort.js +1 -1
- package/dist/src/utils/embeddedTools.js +1 -1
- package/dist/src/utils/envDynamic.js +1 -1
- package/dist/src/utils/envUtils.js +1 -1
- package/dist/src/utils/execFileNoThrowPortable.js +1 -1
- package/dist/src/utils/execSyncWrapper.js +1 -1
- package/dist/src/utils/exportRenderer.js +1 -1
- package/dist/src/utils/extraUsage.js +1 -1
- package/dist/src/utils/fastMode.js +1 -1
- package/dist/src/utils/fileOperationAnalytics.js +1 -1
- package/dist/src/utils/fileRead.js +1 -1
- package/dist/src/utils/findExecutable.js +1 -1
- package/dist/src/utils/format.js +1 -1
- package/dist/src/utils/frontmatterParser.js +1 -1
- package/dist/src/utils/fsOperations.js +1 -1
- package/dist/src/utils/fullscreen.js +1 -1
- package/dist/src/utils/genericProcessUtils.js +1 -1
- package/dist/src/utils/getWorktreePaths.js +1 -1
- package/dist/src/utils/git/gitConfigParser.js +1 -1
- package/dist/src/utils/git/gitFilesystem.js +1 -1
- package/dist/src/utils/git/gitignore.js +1 -1
- package/dist/src/utils/gitDiff.js +1 -1
- package/dist/src/utils/gitSettings.js +1 -1
- package/dist/src/utils/glob.js +1 -1
- package/dist/src/utils/gracefulShutdown.js +1 -1
- package/dist/src/utils/groupToolUses.js +1 -1
- package/dist/src/utils/handlePromptSubmit.js +1 -1
- package/dist/src/utils/hash.js +1 -1
- package/dist/src/utils/hooks/fileChangedWatcher.js +1 -1
- package/dist/src/utils/hooks/hooksSettings.js +1 -1
- package/dist/src/utils/hooks/registerSkillHooks.js +1 -1
- package/dist/src/utils/hooks/sessionHooks.js +1 -1
- package/dist/src/utils/http.js +1 -1
- package/dist/src/utils/hyperlink.js +1 -1
- package/dist/src/utils/ide.js +1 -1
- package/dist/src/utils/idePathConversion.js +1 -1
- package/dist/src/utils/imagePaste.js +1 -1
- package/dist/src/utils/imageResizer.js +1 -1
- package/dist/src/utils/imageStore.js +1 -1
- package/dist/src/utils/inProcessTeammateHelpers.js +1 -1
- package/dist/src/utils/ink.js +1 -1
- package/dist/src/utils/jetbrains.js +1 -1
- package/dist/src/utils/json.js +1 -1
- package/dist/src/utils/listSessionsImpl.js +1 -1
- package/dist/src/utils/localInstaller.js +1 -1
- package/dist/src/utils/lockfile.js +1 -1
- package/dist/src/utils/logoV2Utils.js +1 -1
- package/dist/src/utils/markdown.js +1 -1
- package/dist/src/utils/mcp/dateTimeParser.js +1 -1
- package/dist/src/utils/mcpOutputStorage.js +1 -1
- package/dist/src/utils/mcpValidation.js +1 -1
- package/dist/src/utils/memoize.js +1 -1
- package/dist/src/utils/memory/types.js +1 -1
- package/dist/src/utils/memoryFileDetection.js +1 -1
- package/dist/src/utils/messageQueueManager.js +1 -1
- package/dist/src/utils/messages/mappers.js +1 -1
- package/dist/src/utils/messages/systemInit.js +1 -1
- package/dist/src/utils/model/antModels.js +1 -1
- package/dist/src/utils/model/check1mAccess.js +1 -1
- package/dist/src/utils/model/contextWindowUpgradeCheck.js +1 -1
- package/dist/src/utils/model/model.js +1 -1
- package/dist/src/utils/model/modelAllowlist.js +1 -1
- package/dist/src/utils/model/modelCapabilities.js +1 -1
- package/dist/src/utils/model/modelOptions.js +1 -1
- package/dist/src/utils/model/modelStrings.js +1 -1
- package/dist/src/utils/model/providerBaseUrls.js +1 -1
- package/dist/src/utils/model/providerCatalog.js +1 -1
- package/dist/src/utils/model/providerModels.js +1 -1
- package/dist/src/utils/model/providerProfiles.js +1 -1
- package/dist/src/utils/model/providerProfilesDb.js +1 -1
- package/dist/src/utils/model/providerSwitch.js +1 -1
- package/dist/src/utils/model/providers.js +1 -1
- package/dist/src/utils/modelCost.js +1 -1
- package/dist/src/utils/modifiers.js +1 -1
- package/dist/src/utils/mtls.js +1 -1
- package/dist/src/utils/nativeInstaller/download.js +1 -1
- package/dist/src/utils/nativeInstaller/installer.js +1 -1
- package/dist/src/utils/nativeInstaller/packageManagers.js +1 -1
- package/dist/src/utils/nativeInstaller/pidLock.js +1 -1
- package/dist/src/utils/notebook.js +1 -1
- package/dist/src/utils/pasteStore.js +1 -1
- package/dist/src/utils/path.js +1 -1
- package/dist/src/utils/permissions/PermissionMode.js +1 -1
- package/dist/src/utils/permissions/PermissionPromptToolResultSchema.js +1 -1
- package/dist/src/utils/permissions/PermissionUpdate.js +1 -1
- package/dist/src/utils/permissions/PermissionUpdateSchema.js +1 -1
- package/dist/src/utils/permissions/autoModeState.js +1 -1
- package/dist/src/utils/permissions/bypassPermissionsKillswitch.js +1 -1
- package/dist/src/utils/permissions/filesystem.js +1 -1
- package/dist/src/utils/permissions/getNextPermissionMode.js +1 -1
- package/dist/src/utils/permissions/pathValidation.js +1 -1
- package/dist/src/utils/permissions/permissionRuleParser.js +1 -1
- package/dist/src/utils/permissions/permissionsDb.js +1 -1
- package/dist/src/utils/permissions/permissionsLoader.js +1 -1
- package/dist/src/utils/permissions/shellRuleMatching.js +1 -1
- package/dist/src/utils/planModeV2.js +1 -1
- package/dist/src/utils/plans.js +1 -1
- package/dist/src/utils/platform.js +1 -1
- package/dist/src/utils/plugins/addDirPluginSettings.js +1 -1
- package/dist/src/utils/plugins/cacheUtils.js +1 -1
- package/dist/src/utils/plugins/dependencyResolver.js +1 -1
- package/dist/src/utils/plugins/fetchTelemetry.js +1 -1
- package/dist/src/utils/plugins/gitAvailability.js +1 -1
- package/dist/src/utils/plugins/hintRecommendation.js +1 -1
- package/dist/src/utils/plugins/installedPluginsManager.js +1 -1
- package/dist/src/utils/plugins/loadPluginAgents.js +1 -1
- package/dist/src/utils/plugins/loadPluginCommands.js +1 -1
- package/dist/src/utils/plugins/loadPluginHooks.js +1 -1
- package/dist/src/utils/plugins/loadPluginOutputStyles.js +1 -1
- package/dist/src/utils/plugins/lspPluginIntegration.js +1 -1
- package/dist/src/utils/plugins/lspRecommendation.js +1 -1
- package/dist/src/utils/plugins/managedPlugins.js +1 -1
- package/dist/src/utils/plugins/marketplaceHelpers.js +1 -1
- package/dist/src/utils/plugins/marketplaceManager.js +1 -1
- package/dist/src/utils/plugins/mcpPluginIntegration.js +1 -1
- package/dist/src/utils/plugins/mcpbHandler.js +1 -1
- package/dist/src/utils/plugins/officialMarketplaceGcs.js +1 -1
- package/dist/src/utils/plugins/officialMarketplaceStartupCheck.js +1 -1
- package/dist/src/utils/plugins/orphanedPluginFilter.js +1 -1
- package/dist/src/utils/plugins/performStartupChecks.js +1 -1
- package/dist/src/utils/plugins/pluginAutoupdate.js +1 -1
- package/dist/src/utils/plugins/pluginBlocklist.js +1 -1
- package/dist/src/utils/plugins/pluginDirectories.js +1 -1
- package/dist/src/utils/plugins/pluginFlagging.js +1 -1
- package/dist/src/utils/plugins/pluginInstallationHelpers.js +1 -1
- package/dist/src/utils/plugins/pluginLoader.js +1 -1
- package/dist/src/utils/plugins/pluginOptionsStorage.js +1 -1
- package/dist/src/utils/plugins/pluginPolicy.js +1 -1
- package/dist/src/utils/plugins/pluginStartupCheck.js +1 -1
- package/dist/src/utils/plugins/pluginVersioning.js +1 -1
- package/dist/src/utils/plugins/reconciler.js +1 -1
- package/dist/src/utils/plugins/refresh.js +1 -1
- package/dist/src/utils/plugins/schemas.js +1 -1
- package/dist/src/utils/plugins/walkPluginMarkdown.js +1 -1
- package/dist/src/utils/plugins/zipCache.js +1 -1
- package/dist/src/utils/powershell/parser.js +1 -1
- package/dist/src/utils/processUserInput/processBashCommand.js +1 -1
- package/dist/src/utils/processUserInput/processSlashCommand.js +1 -1
- package/dist/src/utils/processUserInput/processTextPrompt.js +1 -1
- package/dist/src/utils/processUserInput/processUserInput.js +1 -1
- package/dist/src/utils/profilerBase.js +1 -1
- package/dist/src/utils/promptCategory.js +1 -1
- package/dist/src/utils/promptEditor.js +1 -1
- package/dist/src/utils/promptShellExecution.js +1 -1
- package/dist/src/utils/proxy.js +1 -1
- package/dist/src/utils/queryHelpers.js +1 -1
- package/dist/src/utils/queryProfiler.js +1 -1
- package/dist/src/utils/queueProcessor.js +1 -1
- package/dist/src/utils/readFileInRange.js +1 -1
- package/dist/src/utils/releaseNotes.js +1 -1
- package/dist/src/utils/renderOptions.js +1 -1
- package/dist/src/utils/ripgrep.js +1 -1
- package/dist/src/utils/sandbox/sandbox-adapter.js +1 -1
- package/dist/src/utils/sdkEventQueue.js +1 -1
- package/dist/src/utils/secureStorage/index.js +1 -1
- package/dist/src/utils/secureStorage/macOsKeychainHelpers.js +1 -1
- package/dist/src/utils/secureStorage/macOsKeychainStorage.js +1 -1
- package/dist/src/utils/secureStorage/plainTextStorage.js +1 -1
- package/dist/src/utils/secureStorage/sqliteStorage.js +1 -1
- package/dist/src/utils/sessionEnvironment.js +1 -1
- package/dist/src/utils/sessionIngressAuth.js +1 -1
- package/dist/src/utils/sessionRestore.js +1 -1
- package/dist/src/utils/sessionStart.js +1 -1
- package/dist/src/utils/sessionTitle.js +1 -1
- package/dist/src/utils/settings/managedPath.js +1 -1
- package/dist/src/utils/settings/mdm/rawRead.js +1 -1
- package/dist/src/utils/settings/mdm/settings.js +1 -1
- package/dist/src/utils/settings/permissionValidation.js +1 -1
- package/dist/src/utils/settings/pluginOnlyPolicy.js +1 -1
- package/dist/src/utils/settings/schemaOutput.js +1 -1
- package/dist/src/utils/settings/settings.js +1 -1
- package/dist/src/utils/settings/types.js +1 -1
- package/dist/src/utils/settings/validateEditTool.js +1 -1
- package/dist/src/utils/settings/validation.js +1 -1
- package/dist/src/utils/shell/bashProvider.js +1 -1
- package/dist/src/utils/shell/powershellDetection.js +1 -1
- package/dist/src/utils/shell/powershellProvider.js +1 -1
- package/dist/src/utils/shell/readOnlyCommandValidation.js +1 -1
- package/dist/src/utils/shell/resolveDefaultShell.js +1 -1
- package/dist/src/utils/shell/shellToolUtils.js +1 -1
- package/dist/src/utils/shell/specPrefix.js +1 -1
- package/dist/src/utils/shellConfig.js +1 -1
- package/dist/src/utils/sideQuestion.js +1 -1
- package/dist/src/utils/skills/skillChangeDetector.js +1 -1
- package/dist/src/utils/slashCommandParsing.js +1 -1
- package/dist/src/utils/sliceAnsi.js +1 -1
- package/dist/src/utils/slowOperations.js +1 -1
- package/dist/src/utils/standaloneAgent.js +1 -1
- package/dist/src/utils/startupProfiler.js +1 -1
- package/dist/src/utils/staticRender.js +1 -1
- package/dist/src/utils/status.js +1 -1
- package/dist/src/utils/statusNoticeDefinitions.js +1 -1
- package/dist/src/utils/suggestions/commandSuggestions.js +1 -1
- package/dist/src/utils/suggestions/directoryCompletion.js +1 -1
- package/dist/src/utils/suggestions/shellHistoryCompletion.js +1 -1
- package/dist/src/utils/suggestions/skillUsageTracking.js +1 -1
- package/dist/src/utils/suggestions/slackChannelSuggestions.js +1 -1
- package/dist/src/utils/swarm/backends/detection.js +1 -1
- package/dist/src/utils/swarm/permissionSync.js +1 -1
- package/dist/src/utils/swarm/reconnection.js +1 -1
- package/dist/src/utils/swarm/spawnUtils.js +1 -91
- package/dist/src/utils/swarm/teammateInit.js +1 -1
- package/dist/src/utils/systemDirectories.js +1 -1
- package/dist/src/utils/systemPrompt.js +1 -1
- package/dist/src/utils/systemTheme.js +1 -1
- package/dist/src/utils/task/TaskOutput.js +1 -1
- package/dist/src/utils/task/diskOutput.js +1 -1
- package/dist/src/utils/tasks.js +1 -1
- package/dist/src/utils/teamDiscovery.js +1 -1
- package/dist/src/utils/teamMemoryOps.js +1 -1
- package/dist/src/utils/teammateMailbox.js +1 -1
- package/dist/src/utils/telemetry/betaSessionTracing.js +1 -1
- package/dist/src/utils/telemetry/bigqueryExporter.js +1 -1
- package/dist/src/utils/telemetry/events.js +1 -1
- package/dist/src/utils/telemetry/instrumentation.js +1 -1
- package/dist/src/utils/telemetry/logger.js +1 -1
- package/dist/src/utils/telemetry/perfettoTracing.js +1 -1
- package/dist/src/utils/telemetry/pluginTelemetry.js +1 -1
- package/dist/src/utils/telemetry/sessionTracing.js +1 -1
- package/dist/src/utils/telemetryAttributes.js +1 -1
- package/dist/src/utils/teleport/api.js +1 -1
- package/dist/src/utils/teleport/environments.js +1 -1
- package/dist/src/utils/teleport/gitBundle.js +1 -1
- package/dist/src/utils/teleport.js +1 -1
- package/dist/src/utils/tempfile.js +1 -1
- package/dist/src/utils/terminal.js +1 -1
- package/dist/src/utils/terminalPanel.js +1 -1
- package/dist/src/utils/textHighlighting.js +1 -1
- package/dist/src/utils/theme.js +1 -1
- package/dist/src/utils/themes/bootstrap.js +1 -1
- package/dist/src/utils/themes/loader.js +1 -1
- package/dist/src/utils/thinking.js +1 -1
- package/dist/src/utils/tmuxSocket.js +1 -1
- package/dist/src/utils/tokens.js +1 -1
- package/dist/src/utils/toolPool.js +1 -1
- package/dist/src/utils/toolResultStorage.js +1 -1
- package/dist/src/utils/transcriptSearch.js +1 -1
- package/dist/src/utils/truncate.js +1 -1
- package/dist/src/utils/ultraplan/keyword.js +1 -1
- package/dist/src/utils/unaryLogging.js +1 -1
- package/dist/src/utils/undercover.js +1 -1
- package/dist/src/utils/user.js +1 -1
- package/dist/src/utils/userPromptKeywords.js +1 -1
- package/dist/src/utils/which.js +1 -1
- package/dist/src/utils/windowsPaths.js +1 -1
- package/dist/src/utils/worktree.js +1 -1
- package/dist/src/utils/zodToJsonSchema.js +1 -1
- package/dist/src/vim/operators.js +1 -1
- package/dist/src/vim/textObjects.js +1 -1
- package/dist/src/vim/transitions.js +1 -1
- package/dist/src/voice/voiceModeEnabled.js +1 -1
- package/dist/src/webapp/auth.js +1 -1
- package/dist/src/webapp/tunnel.js +1 -1
- package/dist/src/whatsapp/bridge.js +1 -1
- package/dist/src/whatsapp/mirror.js +1 -1
- package/package.json +41 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
import{spawn as e,spawnSync as r}from"node:child_process";import{existsSync as o}from"node:fs";import{join as l}from"node:path";import{logForDebugging as
|
|
1
|
+
import{spawn as e,spawnSync as r}from"node:child_process";import{existsSync as o}from"node:fs";import{join as l}from"node:path";import{logForDebugging as t}from"../utils/debug.js";const n={proc:null,publicUrl:null,startedAt:null,lastError:null,binaryPath:null},a=/https?:\/\/[a-z0-9-]+\.trycloudflare\.com/i;export function isTunnelRunning(){return null!==n.proc}export function getTunnelStatus(){return{running:isTunnelRunning(),publicUrl:n.publicUrl,startedAt:n.startedAt,pid:n.proc?.pid??null,lastError:n.lastError,binaryPath:n.binaryPath}}const s=["No encontré `cloudflared` en tu sistema. Instalación rápida:",""," Windows (winget): winget install --id Cloudflare.cloudflared"," Windows (manual): https://github.com/cloudflare/cloudflared/releases (descargar cloudflared-windows-amd64.exe)"," macOS (brew): brew install cloudflared"," Linux (apt): https://pkg.cloudflare.com/index.html","","Si ya está instalado pero no aparece en PATH, podés indicar la ruta exacta","con la variable de entorno CLOUDFLARED_BIN:","",' Windows PowerShell: $env:CLOUDFLARED_BIN = "C:\\ruta\\a\\cloudflared.exe"'," macOS/Linux: export CLOUDFLARED_BIN=/ruta/a/cloudflared","","Alternativa: usá tu propio túnel/dominio y registralo con:"," /webapp tunnel url https://mi-dominio.example.com"].join("\n");export async function startTunnel(i){if(n.proc)return{ok:!0,publicUrl:n.publicUrl??void 0,message:n.publicUrl?`Túnel ya estaba activo: ${n.publicUrl}`:"Túnel ya estaba arrancando, esperando URL..."};const c=function(){const e=process.env.CLOUDFLARED_BIN?.trim();if(e&&o(e))return e;const t="win32"===process.platform?"where":"which",n="win32"===process.platform?"cloudflared.exe":"cloudflared";try{const e=r(t,[n],{encoding:"utf8",shell:!1,windowsHide:!0});if(0===e.status&&e.stdout){const r=e.stdout.split(/\r?\n/).map(e=>e.trim()).filter(Boolean)[0];if(r&&o(r))return r}}catch{}const a=[];if("win32"===process.platform){const e=process.env.ProgramFiles??"C:\\Program Files",r=process.env["ProgramFiles(x86)"]??"C:\\Program Files (x86)",o=process.env.LOCALAPPDATA;a.push(l(e,"cloudflared","cloudflared.exe"),l(r,"cloudflared","cloudflared.exe")),o&&a.push(l(o,"Microsoft","WinGet","Packages","Cloudflare.cloudflared_Microsoft.Winget.Source_8wekyb3d8bbwe","cloudflared.exe"))}else"darwin"===process.platform?a.push("/opt/homebrew/bin/cloudflared","/usr/local/bin/cloudflared"):a.push("/usr/local/bin/cloudflared","/usr/bin/cloudflared");for(const e of a)if(o(e))return e;return null}();if(!c)return n.lastError="cloudflared no encontrado en PATH ni rutas conocidas",{ok:!1,message:s};let u;n.binaryPath=c,t(`[webapp:tunnel] usando binario: ${c}`);try{u=e(c,["tunnel","--url",`http://localhost:${i}`,"--no-autoupdate","--logfile","-"],{stdio:["ignore","pipe","pipe"],windowsHide:!0})}catch(e){return n.lastError=e instanceof Error?e.message:String(e),{ok:!1,message:`${s}\n\nDetalle: ${n.lastError}`}}n.proc=u,n.publicUrl=null,n.startedAt=Date.now(),n.lastError=null;let d="";const p=new Promise(e=>{let r=!1;u.once("error",o=>{r||(r=!0,e(o))}),setTimeout(()=>{r||(r=!0,e(null))},2e3)}),f=new Promise(e=>{let r=!1;const onData=o=>{const l=o.toString("utf8");d=(d+l).slice(-4096),t(`[webapp:tunnel] ${l.trim()}`);const s=l.match(a);s&&!r&&(r=!0,n.publicUrl=s[0],e(s[0]))};u.stdout.on("data",onData),u.stderr.on("data",onData),u.once("exit",()=>{r||(r=!0,e(null))}),setTimeout(()=>{r||(r=!0,e(null))},3e4)});u.on("exit",e=>{t(`[webapp:tunnel] cloudflared salió con código ${e}`),n.proc===u&&(n.proc=null,n.publicUrl=null,n.startedAt=null)}),u.on("error",e=>{n.lastError=e.message,t(`[webapp:tunnel] error: ${e.message}`)});const m=await p;if(m){n.proc=null,n.lastError=m.message;return"ENOENT"===m.code?{ok:!1,message:s}:{ok:!1,message:`Fallo al arrancar cloudflared: ${m.message}`}}const b=await f;if(!b){n.lastError="No recibí URL pública de cloudflared en 30s.";const e=d.trim().slice(-800);return{ok:!1,message:"Arranqué cloudflared pero no recibí URL pública en 30s.\n"+(e?`Últimas líneas de log:\n${e}\n\n`:"")+"Probá: /webapp tunnel stop y luego /webapp tunnel start.\nSi persiste, verificá conectividad a https://api.trycloudflare.com."}}return{ok:!0,publicUrl:b,message:`Túnel activo: ${b}`}}export async function stopTunnel(){if(!n.proc)return{ok:!0,message:"No había túnel activo."};const e=n.proc;n.proc=null,n.publicUrl=null,n.startedAt=null;try{return e.kill("SIGTERM"),await new Promise(r=>{const o=setTimeout(()=>{try{e.kill("SIGKILL")}catch{}r()},3e3);e.once("exit",()=>{clearTimeout(o),r()})}),{ok:!0,message:"Túnel detenido."}}catch(e){return{ok:!1,message:`No pude detener cloudflared limpiamente: ${e instanceof Error?e.message:String(e)}`}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"node:fs/promises";import{dirname as a,join as t}from"node:path";import{tmpdir as o}from"node:os";import{addAllowedNumber as r,clearLinkedIdentity as i,e164ToJid as s,ensureCurrentWorkspaceRegistered as n,ensureWorkspaceRegisteredByPath as l,getActiveWorkspaceForNumber as d,getActiveWorkspaceAliasForNumber as c,getAllowedNumbers as u,getPrimaryRecipient as p,getWhatsAppAuthDir as m,getWhatsAppConfig as w,jidToE164 as g,listWhatsAppWorkspaces as f,normalizeE164 as y,setActiveWorkspaceAliasForNumber as v,setPrimaryRecipient as b,setSelfIdentity as h,setWhatsAppRunning as $}from"./config.js";import{closeSocketSafe as T,createWaSocket as A,getDisconnectStatus as j,readSelfIdentity as J,waitForOpenConnection as B,wipeAuthDir as k}from"./session.js";import{setMirrorSocket as E}from"./mirror.js";import{markInjectedFromWhatsApp as C}from"./mirror.js";import{logForDebugging as M}from"../utils/debug.js";import{getStoredActiveProviderPreference as P,getStoredLastModelForProvider as R,setStoredActiveProviderPreference as W,setStoredLastModelForProvider as x}from"../utils/model/providerProfilesDb.js";import{isProfiledProvider as S,listProviderProfiles as D,setActiveProfileForProvider as N}from"../utils/model/providerProfiles.js";import{checkLocalDictationConfiguration as L,transcribeAudioFile as O}from"../services/localDictation.js";import{runGlobalPromptForWhatsApp as G}from"../bridgeGlobal/runner.js";import{getGlobalBridgeDaemonStatus as I,startGlobalBridgeDaemon as F,stopGlobalBridgeDaemon as U}from"../bridgeGlobal/manager.js";import{approvePending as _,listPending as q,rejectPending as z}from"./permissionInbox.js";export function waTitle(e){return`*${e.toUpperCase()}*`}export function waBullet(e){return`-> ${e}`}export function waCode(e){return`>> ${e}`}export function waAlert(e){return`!! ${e}`}let Q=null,H=null,X=null;async function enqueueCommand(e){if(!X){const e=await import("../utils/messageQueueManager.js");X=e.enqueue}X(e)}export function setWhatsAppInboundHandler(e){H=e}export function isWhatsAppBridgeRunning(){return null!==Q}async function autoUnlinkOnLoggedOut(){Q&&(T(Q),Q=null,E(null)),await k(m()),i()}export async function unlinkWhatsApp(){try{return Q&&(T(Q),Q=null,E(null)),await k(m()),i(),{success:!0,message:"Cuenta desvinculada y credenciales borradas."}}catch(e){return{success:!1,message:`Error al desvincular: ${e instanceof Error?e.message:String(e)}`}}}function handleInbound(r){if(!r?.message||r.key?.fromMe)return;const i=r.key?.remoteJid;if(!i)return;if(M(`[wa:inbound] upsert remoteJid=${i}`),i.endsWith("@g.us")||i.endsWith("@newsletter"))return void M(`[wa:inbound] ignored non-direct remoteJid=${i}`);let s=function(e){const a=e?.key??{},t=[a.remoteJid,a.remoteJidAlt,a.participant,a.participantAlt,e?.participant,e?.participantAlt];for(const e of t){if(!e||"string"!=typeof e)continue;const a=g(e);if(a)return a}return null}(r);const m=p(),w=u(),y=i.endsWith("@lid");if(s&&!y||(m?s=m:1===w.length&&(s=w[0])),!s)return void M(`[wa:inbound] dropped: senderE164 unresolved remoteJid=${i}`);if(M(`[wa:inbound] sender=${s}`),0!==w.length||p()){if(!function(e){const a=u();return 0===a.length||a.includes(e)}(s))return void M(`[wa:inbound] dropped: sender not allowed sender=${s}`)}else b(s),M(`[wa:inbound] bootstrap primaryRecipient=${s}`);if(Boolean(r?.message?.imageMessage))return void async function(e,a,t){try{const o=(await import("@whiskeysockets/baileys")).downloadMediaMessage;if("function"!=typeof o)return void await replyToJid(a,"No pude descargar la imagen.");await replyToJid(a,"Descargando y procesando imagen...");const r=await o(e,"buffer",{});if(!r||0===r.length)return void await replyToJid(a,"No pude leer la imagen.");const i=r.toString("base64"),s=e.message?.imageMessage?.mimetype||"image/jpeg",n=e.message?.imageMessage?.caption?.trim()||"Analiza esta imagen.",l=Date.now(),d={id:l,type:"image",content:i,mediaType:s,filename:`wa_image_${l}`},{storeImage:c}=await import("../utils/imageStore.js");await c(d);const u={[l]:d};if(isGlobalBridgeModeEnabled())return void await replyToJid(a,"El modo de prompt global no soporta imágenes todavía.");C(n),enqueueCommand({value:n,mode:"prompt",pastedContents:u,skipSlashCommands:!1,bridgeOrigin:!0}),M(`[wa:inbound] image injected via enqueue sender=${t}`)}catch(e){await replyToJid(a,`Error procesando imagen: ${e instanceof Error?e.message:String(e)}`)}}(r,i,s);const h=($=r.message)?"string"==typeof $.conversation?$.conversation:"string"==typeof $.extendedTextMessage?.text?$.extendedTextMessage.text:"string"==typeof $.imageMessage?.caption?$.imageMessage.caption:"string"==typeof $.videoMessage?.caption?$.videoMessage.caption:"string"==typeof $.buttonsResponseMessage?.selectedDisplayText?$.buttonsResponseMessage.selectedDisplayText:"":"";var $;if(!h)return Boolean(r?.message?.audioMessage)||Boolean(r?.message?.pttMessage)||Boolean(r?.message?.documentMessage?.mimetype?.startsWith?.("audio/"))?void async function(a,r,i){try{if(!(await L()).available)return void await replyToJid(r,"No puedo transcribir audio ahora. Configura dictado local con /dictar install");const s=(await import("@whiskeysockets/baileys")).downloadMediaMessage;if("function"!=typeof s)return void await replyToJid(r,"No pude descargar el audio para transcribirlo.");const n=await s(a,"buffer",{});if(!n||0===n.length)return void await replyToJid(r,"No pude leer el audio para transcribirlo.");const l=await e.mkdtemp(t(o(),"context-wa-audio-")),d=t(l,"input.ogg");try{await e.writeFile(d,n);const a=(await O(d)).trim();if(!a)return void await replyToJid(r,"No detecte voz en el audio.");const t=a;if(H)return H(t),void M(`[wa:inbound] audio transcribed via inboundHandler sender=${i}`);if(isGlobalBridgeModeEnabled())return void await runGlobalPromptFlow(t,r,i);C(t),enqueueCommand({value:t,mode:"prompt",skipSlashCommands:!1,bridgeOrigin:!0}),M(`[wa:inbound] audio transcribed via enqueue fallback sender=${i}`)}finally{await e.rm(l,{recursive:!0,force:!0})}}catch(e){await replyToJid(r,`Error transcribiendo audio: ${e instanceof Error?e.message:String(e)}`)}}(r,i,s):void M(`[wa:inbound] dropped: empty text sender=${s}`);const T=h.trim();if(T.startsWith("/"))return M(`[wa:inbound] slash message sender=${s} text=${T.slice(0,80)}`),void(async()=>{const o=await async function(o,r,i){const[s,...u]=o.split(/\s+/),p=s.toLowerCase();if("/proveedores"===p||"/providers"===p){const e=P()??"claude",a=["claude","openai","openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","deepseek"].map(a=>waBullet(a===e?`*${a}* (activo)`:a));return await replyToJid(r,[waTitle("Proveedores"),"",`*Activo:* ${e}`,"","==","",waTitle("Disponibles"),...a,"","==","",waTitle("Opciones"),waBullet("list -> listar proveedores"),waBullet("current -> ver proveedor actual"),waBullet("set -> cambiar proveedor"),"","==","",`*Uso:* ${waCode("/provider <nombre>")}`].join("\n")),!0}if("/provider"===p){const e=u.join(" ").trim().toLowerCase();if(!e){const e=P()??"claude";return await replyToJid(r,[waTitle("Proveedor Actual"),"",`*Activo:* ${e}`,"","==","",waTitle("Opciones"),waBullet("list -> "+waCode("/proveedores")),waBullet("set -> "+waCode("/provider <nombre>"))].join("\n")),!0}if(!new Set(["claude","openai","openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","deepseek"]).has(e))return await replyToJid(r,[waTitle("Proveedor No Valido"),"",`*Recibido:* ${e}`,"","==","",`*Ayuda:* usa ${waCode("/proveedores")}`].join("\n")),!0;W(e);const a=R(e)??"(sin modelo guardado)";return await replyToJid(r,[waTitle("Proveedor Actualizado"),"",`*Nuevo proveedor:* ${e}`,`*Modelo actual:* ${a}`].join("\n")),!0}if("/modelo"===p||"/model"===p){const e=u.join(" ").trim(),a=P()??"claude";if(!e){const e=R(a)??"(sin modelo guardado)";return await replyToJid(r,[waTitle("Modelo Actual"),"",`*Proveedor:* ${a}`,`*Modelo:* ${e}`,"","==","",`*Uso:* ${waCode("/modelo <nombre>")}`].join("\n")),!0}return x(a,e),await replyToJid(r,[waTitle("Modelo Actualizado"),"",`*Proveedor:* ${a}`,`*Nuevo modelo:* ${e}`].join("\n")),!0}if("/profiles"===p||"/perfiles"===p){const e=P()??"claude";if(!S(e))return await replyToJid(r,`${waAlert("Error")}\nEl proveedor activo (${e}) no usa perfiles.`),!0;const a=D(e);if(0===a.length)return await replyToJid(r,`${waAlert("Aviso")}\nNo hay perfiles para ${e}. Crea uno desde CLI con /provider.`),!0;const t=a.map(e=>{const a=e.lastModel??"-";return waBullet(`${e.name} (model: ${a})`)});return await replyToJid(r,[waTitle(`Perfiles de ${e}`),"",...t,"","==","",`*Uso:* ${waCode("/profile <nombre>")}`].join("\n")),!0}if("/profile"===p||"/perfil"===p){const e=P()??"claude";if(!S(e))return await replyToJid(r,`${waAlert("Error")}\nEl proveedor activo (${e}) no usa perfiles.`),!0;const a=u.join(" ").trim();if(!a)return await replyToJid(r,`*Uso:* ${waCode("/profile <nombre>")}`),!0;const t=N(e,a);return await replyToJid(r,[waTitle("Perfil Activado"),"",`*Perfil:* ${t.provider}/${t.name}`,`*Agente:* ${t.agentName}`].join("\n")),!0}if("/repos"===p){const e=n(),a=f(),t=c(i)??e.alias,o=a.map(e=>{const a=e.alias===t?" * (activo)":"";return waBullet(`${e.alias}${a}`)});return await replyToJid(r,[waTitle("Repos Registrados"),"",...o,"","==","",`*Uso:* ${waCode("/use <alias>")}`].join("\n")),!0}if("/workspace-sync"===p){const o=await async function(){const o=[],r=new Set,i=new Set([process.cwd(),a(process.cwd())]);for(const a of i){try{if(await e.stat(t(a,".git"))){const e=l(a);r.has(e.path)||(r.add(e.path),o.push({alias:e.alias,path:e.path}))}}catch{}let i=[];try{i=await e.readdir(a,{withFileTypes:!0})}catch{continue}for(const s of i){if(!s.isDirectory())continue;const i=t(a,s.name);try{if(!await e.stat(t(i,".git")))continue}catch{continue}const n=l(i);r.has(n.path)||(r.add(n.path),o.push({alias:n.alias,path:n.path}))}}return o}();if(0===o.length)return await replyToJid(r,`${waAlert("Aviso")}\nNo encontre repos nuevos cerca del directorio actual.`),!0;const i=o.map(e=>waBullet(e.alias));return await replyToJid(r,[waTitle("Repos Detectados"),"",...i].join("\n")),!0}if("/use"===p||"/cd"===p){const e=u.join(" ").trim();if(!e)return await replyToJid(r,`*Uso:* ${waCode(p+" <alias>")}`),!0;const a=await switchProcessWorkspaceByAlias(e);if(!a.ok)return await replyToJid(r,`${waAlert("Error")}\n${a.message}`),!0;if(!v(i,a.alias))return await replyToJid(r,`${waAlert("Error")}\nNo existe el repo "${e}". Usa /repos para ver aliases.`),!0;const t=d(i);return await replyToJid(r,[waTitle("Repo Activado"),"",`*Alias:* ${t?.alias??a.alias}`,`*Ruta:* ${t?.path??a.path}`,`*CWD:* ${process.cwd()}`].join("\n")),!0}if("/status"===p){const e=n(),a=d(i)??e,t=(process.env.CONTEXT_BRIDGE_RESUME_MIRROR_MODE??process.env.CONTEXT_RESUME_MIRROR_MODE??"summary").toLowerCase();return await replyToJid(r,[waTitle("Estado del Bridge"),"",`*Repo activo:* ${a.alias}`,`*Ruta:* ${a.path}`,`*Numero:* ${i}`,`*Total repos:* ${f().length}`,`*Resume mirror:* ${t}`].join("\n")),!0}if("/canal-global"===p||"/global-canal"===p||"/cg"===p){const e=(u[0]??"status").toLowerCase();if("status"===e||"estado"===e){const e=await I();return await replyToJid(r,[waTitle("Canal Global"),"","*Estado:* "+(e.running?"activo":"inactivo"),`*PID:* ${e.pid??"n/a"}`,`*Inicio:* ${e.startedAt??"n/a"}`,"","==","",waTitle("Opciones"),waBullet("/canal-global start"),waBullet("/canal-global stop"),waBullet("/canal-global status")].join("\n")),!0}if("start"===e||"iniciar"===e){const e=await F();return await replyToJid(r,`*Resultado:* ${e}`),!0}if("stop"===e||"detener"===e){const e=await U();return await replyToJid(r,`*Resultado:* ${e}`),!0}return await replyToJid(r,[waTitle("Canal Global - Ayuda"),"",waBullet("/canal-global status"),waBullet("/canal-global start"),waBullet("/canal-global stop")].join("\n")),!0}if("/aprobar"===p||"/approve"===p||"/aprobar-siempre"===p||"/approve-always"===p||"/denegar"===p||"/deny"===p){const e="/aprobar-siempre"===p||"/approve-always"===p,a="/denegar"===p||"/deny"===p,t=u.join(" ").trim();if(!t){const e=q();if(0===e.length)return await replyToJid(r,`${waAlert("Aviso")}\nNo hay permisos pendientes.`),!0;const a=e.map(e=>waBullet(`[${e.id}] ${e.toolName}: ${(e.description||"(sin detalle)").slice(0,100)}`));return await replyToJid(r,[waTitle(`Permisos pendientes (${e.length})`),"",...a,"","==","","*Uso:* /aprobar <id> o /aprobar-siempre <id> o /denegar <id>"].join("\n")),!0}const o=t.toLowerCase(),i=a?z(o):_(o,e);if("not_found"===i.kind)return await replyToJid(r,`${waAlert("Error")}\nNo encontre ningun permiso con id "${o}". Usa /aprobar para listarlos.`),!0;if("already_resolved"===i.kind)return await replyToJid(r,`${waAlert("Aviso")}\nEl permiso ${o} (${i.item.toolName}) ya fue resuelto — ignorado.`),!0;const s=a?"rechazado":e?"aprobado permanentemente":"aprobado";return await replyToJid(r,[waTitle("Permiso Resuelto"),"",`*ID:* ${o}`,`*Herramienta:* ${i.item.toolName}`,`*Accion:* ${s}`].join("\n")),!0}return("/help"===p||"/ayuda"===p||"/ayudame"===p)&&(await replyToJid(r,[waTitle("Ayuda WhatsApp Bridge"),"",waBullet("/repos -> ver repos registrados"),waBullet("/use <alias> -> cambiar de repo"),waBullet("/status -> ver estado actual"),waBullet("/workspace-sync -> registrar repos git"),waBullet("/proveedores -> ver proveedores"),waBullet("/provider <nombre> -> cambiar proveedor"),waBullet("/modelo <nombre> -> cambiar modelo"),waBullet("/profiles -> ver perfiles"),waBullet("/profile <nombre> -> cambiar perfil"),waBullet("/canal-global <start|stop|status>"),waBullet("/aprobar [id] -> resolver permisos"),waBullet("/ayuda -> mostrar ayuda")].join("\n")),!0)}(T,i,s);if(!o){if(M(`[wa:inbound] slash passthrough to CLI sender=${s}`),H)return H(T),void M(`[wa:inbound] injected via inboundHandler sender=${s}`);C(T),enqueueCommand({value:T,mode:"prompt",skipSlashCommands:!1,bridgeOrigin:!0}),M(`[wa:inbound] injected via enqueue fallback sender=${s}`)}})();if(H)return H(h),void M(`[wa:inbound] text injected via inboundHandler sender=${s}`);if(isGlobalBridgeModeEnabled())return void runGlobalPromptFlow(h.trim(),i,s);const A=h.trim();A&&(C(A),enqueueCommand({value:A,mode:"prompt",skipSlashCommands:!1,bridgeOrigin:!0}),M(`[wa:inbound] text injected via enqueue fallback sender=${s}`))}function isGlobalBridgeModeEnabled(){return"1"===process.env.CONTEXT_BRIDGE_GLOBAL_MODE}async function runGlobalPromptFlow(e,a,t){if(e)try{await replyToJid(a,"Procesando...");const o=await G(e,t);await replyToJid(a,o)}catch(e){await replyToJid(a,`Error ejecutando prompt global: ${e instanceof Error?e.message:String(e)}`)}}async function replyToJid(e,a){if(Q)try{await Q.sendMessage(e,{text:a})}catch{}}async function switchProcessWorkspaceByAlias(a){const t=a.trim().toLowerCase(),o=f().find(e=>e.alias.toLowerCase()===t);if(!o)return{ok:!1,message:`No existe el repo "${a}". Usa /repos para ver aliases.`};try{if(!(await e.stat(o.path)).isDirectory())return{ok:!1,message:`La ruta de ${o.alias} no es una carpeta valida: ${o.path}`}}catch{return{ok:!1,message:`La ruta de ${o.alias} no existe: ${o.path}`}}try{process.chdir(o.path)}catch(e){return{ok:!1,message:`No pude cambiar al repo ${o.alias}: ${e instanceof Error?e.message:String(e)}`}}return{ok:!0,alias:o.alias,path:o.path}}export async function startLoginWithQr(e){const a=m(),t=await J(a);if(t.jid)return{alreadyLinked:!0,selfJid:t.jid,selfE164:t.e164};Q&&(T(Q),Q=null);const{sock:o,saveCreds:r}=await A({authDir:a,onQr:e.onQr}),i=e.timeoutMs??12e4;try{await Promise.race([B(o),new Promise((e,a)=>setTimeout(()=>a(new Error("QR timeout")),i))])}catch(e){if(515!==j(e))throw T(o),e;{T(o);const e=await A({authDir:a});try{await B(e.sock),T(e.sock)}catch{}}}T(o);try{await r()}catch{}const s=await J(a);return s.jid&&h(s.jid,s.e164),{alreadyLinked:!1,selfJid:s.jid,selfE164:s.e164}}export async function startWhatsAppBridge(){if(Q)return{success:!1,message:"El bridge ya está en ejecución."};const e=m(),a=await J(e);if(!a.jid)return{success:!1,message:"WhatsApp no está vinculado. Escanea el QR desde /whatsapp primero."};try{const t=n(),o=p(),r=o?c(o):void 0;r&&await switchProcessWorkspaceByAlias(r);const{sock:i}=await A({authDir:e});await B(i),function(e){const a=e?.user?.id,t=e?.user?.lid,o=a??t;if(!o)return;const r=String(o).split("@")[0]?.split(":")[0],i=r&&/^\d+$/.test(r)?`+${r}`:void 0;h(o,i)}(i),function(e){e.ev.on("messages.upsert",a=>{if(a&&Array.isArray(a.messages))for(const t of a.messages){try{handleInbound(t)}catch{}try{const a=t?.key,o=a?.remoteJid;!a||a.fromMe||!o||o.endsWith("@g.us")||o.endsWith("@newsletter")||"function"!=typeof e.readMessages||e.readMessages([a]).catch(()=>{})}catch{}}})}(i),function(e){e.ev.on("connection.update",a=>{"close"===a?.connection&&(401===j(a.lastDisconnect?.error)?autoUnlinkOnLoggedOut():Q===e&&(T(Q),Q=null,E(null),$(!1)))})}(i),Q=i,E(i),$(!0);const s=w();return{success:!0,message:`Bridge iniciado correctamente. Cuenta: ${s?.selfE164??a.e164??"desconocido"}. Repo activo: ${t.alias}`}}catch(e){return 401===j(e)?(await autoUnlinkOnLoggedOut(),{success:!1,message:"WhatsApp reportó que la sesión fue cerrada desde el móvil. Credenciales limpiadas; ejecuta /whatsapp de nuevo para mostrar un QR fresco."}):{success:!1,message:`Error al iniciar: ${e instanceof Error?e.message:String(e)}`}}}export async function stopWhatsAppBridge(){if(!Q)return{success:!1,message:"El bridge no está en ejecución."};try{return T(Q),Q=null,E(null),$(!1),{success:!0,message:"Bridge detenido correctamente."}}catch(e){return Q=null,E(null),$(!1),{success:!1,message:`Error al detener: ${e instanceof Error?e.message:String(e)}`}}}export{r as addAllowedNumber,y as normalizeE164,s as e164ToJid};
|
|
1
|
+
import e from"node:fs/promises";import{dirname as a,join as o}from"node:path";import{tmpdir as t}from"node:os";import{addAllowedNumber as r,clearLinkedIdentity as i,e164ToJid as n,ensureCurrentWorkspaceRegistered as s,ensureWorkspaceRegisteredByPath as l,getActiveWorkspaceForNumber as d,getActiveWorkspaceAliasForNumber as c,getAllowedNumbers as u,getPrimaryRecipient as p,getWhatsAppAuthDir as m,getWhatsAppConfig as w,jidToE164 as f,listWhatsAppWorkspaces as g,normalizeE164 as y,setActiveWorkspaceAliasForNumber as v,setPrimaryRecipient as b,setSelfIdentity as $,setWhatsAppRunning as h}from"./config.js";import{closeSocketSafe as T,createWaSocket as J,getDisconnectStatus as j,readSelfIdentity as B,waitForOpenConnection as E,wipeAuthDir as A}from"./session.js";import{setMirrorSocket as C}from"./mirror.js";import{markInjectedFromWhatsApp as k}from"./mirror.js";import{logForDebugging as M}from"../utils/debug.js";import{getStoredActiveProviderPreference as x,getStoredLastModelForProvider as R,setStoredActiveProviderPreference as N,setStoredLastModelForProvider as P}from"../utils/model/providerProfilesDb.js";import{isProfiledProvider as D,listProviderProfiles as O,setActiveProfileForProvider as W}from"../utils/model/providerProfiles.js";import{checkLocalDictationConfiguration as L,transcribeAudioFile as S}from"../services/localDictation.js";import{runGlobalPromptForWhatsApp as U}from"../bridgeGlobal/runner.js";import{getGlobalBridgeDaemonStatus as G,startGlobalBridgeDaemon as I,stopGlobalBridgeDaemon as _}from"../bridgeGlobal/manager.js";import{approvePending as q,listPending as z,rejectPending as Q}from"./permissionInbox.js";export function waTitle(e){return`*${e.toUpperCase()}*`}export function waBullet(e){return`-> ${e}`}export function waCode(e){return`>> ${e}`}export function waAlert(e){return`!! ${e}`}let F=null,H=null,X=null;async function enqueueCommand(e){if(!X){const e=await import("../utils/messageQueueManager.js");X=e.enqueue}X(e)}export function setWhatsAppInboundHandler(e){H=e}export function isWhatsAppBridgeRunning(){return null!==F}async function autoUnlinkOnLoggedOut(){F&&(T(F),F=null,C(null)),await A(m()),i()}export async function unlinkWhatsApp(){try{return F&&(T(F),F=null,C(null)),await A(m()),i(),{success:!0,message:"Cuenta desvinculada y credenciales borradas."}}catch(e){return{success:!1,message:`Error al desvincular: ${e instanceof Error?e.message:String(e)}`}}}function handleInbound(r){if(!r?.message||r.key?.fromMe)return;const i=r.key?.remoteJid;if(!i)return;if(M(`[wa:inbound] upsert remoteJid=${i}`),i.endsWith("@g.us")||i.endsWith("@newsletter"))return void M(`[wa:inbound] ignored non-direct remoteJid=${i}`);let n=function(e){const a=e?.key??{},o=[a.remoteJid,a.remoteJidAlt,a.participant,a.participantAlt,e?.participant,e?.participantAlt];for(const e of o){if(!e||"string"!=typeof e)continue;const a=f(e);if(a)return a}return null}(r);const m=p(),w=u(),y=i.endsWith("@lid");if(n&&!y||(m?n=m:1===w.length&&(n=w[0])),!n)return void M(`[wa:inbound] dropped: senderE164 unresolved remoteJid=${i}`);if(M(`[wa:inbound] sender=${n}`),0!==w.length||p()){if(!function(e){const a=u();return 0===a.length||a.includes(e)}(n))return void M(`[wa:inbound] dropped: sender not allowed sender=${n}`)}else b(n),M(`[wa:inbound] bootstrap primaryRecipient=${n}`);if(Boolean(r?.message?.imageMessage))return void async function(e,a,o){try{const t=(await import("@whiskeysockets/baileys")).downloadMediaMessage;if("function"!=typeof t)return void await replyToJid(a,"No pude descargar la imagen.");await replyToJid(a,"Descargando y procesando imagen...");const r=await t(e,"buffer",{});if(!r||0===r.length)return void await replyToJid(a,"No pude leer la imagen.");const i=r.toString("base64"),n=e.message?.imageMessage?.mimetype||"image/jpeg",s=e.message?.imageMessage?.caption?.trim()||"Analiza esta imagen.",l=Date.now(),d={id:l,type:"image",content:i,mediaType:n,filename:`wa_image_${l}`},{storeImage:c}=await import("../utils/imageStore.js");await c(d);const u={[l]:d};if(isGlobalBridgeModeEnabled())return void await replyToJid(a,"El modo de prompt global no soporta imágenes todavía.");k(s),enqueueCommand({value:s,mode:"prompt",pastedContents:u,skipSlashCommands:!1,bridgeOrigin:!0}),M(`[wa:inbound] image injected via enqueue sender=${o}`)}catch(e){await replyToJid(a,`Error procesando imagen: ${e instanceof Error?e.message:String(e)}`)}}(r,i,n);const $=(h=r.message)?"string"==typeof h.conversation?h.conversation:"string"==typeof h.extendedTextMessage?.text?h.extendedTextMessage.text:"string"==typeof h.imageMessage?.caption?h.imageMessage.caption:"string"==typeof h.videoMessage?.caption?h.videoMessage.caption:"string"==typeof h.buttonsResponseMessage?.selectedDisplayText?h.buttonsResponseMessage.selectedDisplayText:"":"";var h;if(!$){return Boolean(r?.message?.audioMessage)||Boolean(r?.message?.pttMessage)||Boolean(r?.message?.documentMessage?.mimetype?.startsWith?.("audio/"))?void async function(a,r,i){try{if(!(await L()).available)return void await replyToJid(r,"No puedo transcribir audio ahora. Configura dictado local con /dictar install");const n=(await import("@whiskeysockets/baileys")).downloadMediaMessage;if("function"!=typeof n)return void await replyToJid(r,"No pude descargar el audio para transcribirlo.");const s=await n(a,"buffer",{});if(!s||0===s.length)return void await replyToJid(r,"No pude leer el audio para transcribirlo.");const l=await e.mkdtemp(o(t(),"context-wa-audio-")),d=o(l,"input.ogg");try{await e.writeFile(d,s);const a=(await S(d)).trim();if(!a)return void await replyToJid(r,"No detecte voz en el audio.");const o=a;if(H)return H(o),void M(`[wa:inbound] audio transcribed via inboundHandler sender=${i}`);if(isGlobalBridgeModeEnabled())return void await runGlobalPromptFlow(o,r,i);k(o),enqueueCommand({value:o,mode:"prompt",skipSlashCommands:!1,bridgeOrigin:!0}),M(`[wa:inbound] audio transcribed via enqueue fallback sender=${i}`)}finally{await e.rm(l,{recursive:!0,force:!0})}}catch(e){await replyToJid(r,`Error transcribiendo audio: ${e instanceof Error?e.message:String(e)}`)}}(r,i,n):void M(`[wa:inbound] dropped: empty text sender=${n}`)}const T=$.trim();if(T.startsWith("/"))return M(`[wa:inbound] slash message sender=${n} text=${T.slice(0,80)}`),void(async()=>{const t=await async function(t,r,i){const[n,...u]=t.split(/\s+/),p=n.toLowerCase();if("/proveedores"===p||"/providers"===p){const e=x()??"claude",a=["claude","openai","openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","deepseek"].map(a=>waBullet(a===e?`*${a}* (activo)`:a));return await replyToJid(r,[waTitle("Proveedores"),"",`*Activo:* ${e}`,"","==","",waTitle("Disponibles"),...a,"","==","",waTitle("Opciones"),waBullet("list -> listar proveedores"),waBullet("current -> ver proveedor actual"),waBullet("set -> cambiar proveedor"),"","==","",`*Uso:* ${waCode("/provider <nombre>")}`].join("\n")),!0}if("/provider"===p){const e=u.join(" ").trim().toLowerCase();if(!e){const e=x()??"claude";return await replyToJid(r,[waTitle("Proveedor Actual"),"",`*Activo:* ${e}`,"","==","",waTitle("Opciones"),waBullet("list -> "+waCode("/proveedores")),waBullet("set -> "+waCode("/provider <nombre>"))].join("\n")),!0}if(!new Set(["claude","openai","openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","deepseek"]).has(e))return await replyToJid(r,[waTitle("Proveedor No Valido"),"",`*Recibido:* ${e}`,"","==","",`*Ayuda:* usa ${waCode("/proveedores")}`].join("\n")),!0;N(e);const a=R(e)??"(sin modelo guardado)";return await replyToJid(r,[waTitle("Proveedor Actualizado"),"",`*Nuevo proveedor:* ${e}`,`*Modelo actual:* ${a}`].join("\n")),!0}if("/modelo"===p||"/model"===p){const e=u.join(" ").trim(),a=x()??"claude";if(!e){const e=R(a)??"(sin modelo guardado)";return await replyToJid(r,[waTitle("Modelo Actual"),"",`*Proveedor:* ${a}`,`*Modelo:* ${e}`,"","==","",`*Uso:* ${waCode("/modelo <nombre>")}`].join("\n")),!0}return P(a,e),await replyToJid(r,[waTitle("Modelo Actualizado"),"",`*Proveedor:* ${a}`,`*Nuevo modelo:* ${e}`].join("\n")),!0}if("/profiles"===p||"/perfiles"===p){const e=x()??"claude";if(!D(e))return await replyToJid(r,`${waAlert("Error")}\nEl proveedor activo (${e}) no usa perfiles.`),!0;const a=O(e);if(0===a.length)return await replyToJid(r,`${waAlert("Aviso")}\nNo hay perfiles para ${e}. Crea uno desde CLI con /provider.`),!0;const o=a.map(e=>{const a=e.lastModel??"-";return waBullet(`${e.name} (model: ${a})`)});return await replyToJid(r,[waTitle(`Perfiles de ${e}`),"",...o,"","==","",`*Uso:* ${waCode("/profile <nombre>")}`].join("\n")),!0}if("/profile"===p||"/perfil"===p){const e=x()??"claude";if(!D(e))return await replyToJid(r,`${waAlert("Error")}\nEl proveedor activo (${e}) no usa perfiles.`),!0;const a=u.join(" ").trim();if(!a)return await replyToJid(r,`*Uso:* ${waCode("/profile <nombre>")}`),!0;const o=W(e,a);return await replyToJid(r,[waTitle("Perfil Activado"),"",`*Perfil:* ${o.provider}/${o.name}`,`*Agente:* ${o.agentName}`].join("\n")),!0}if("/repos"===p){const e=s(),a=g(),o=c(i)??e.alias,t=a.map(e=>{const a=e.alias===o?" * (activo)":"";return waBullet(`${e.alias}${a}`)});return await replyToJid(r,[waTitle("Repos Registrados"),"",...t,"","==","",`*Uso:* ${waCode("/use <alias>")}`].join("\n")),!0}if("/workspace-sync"===p){const t=await async function(){const t=[],r=new Set,i=new Set([process.cwd(),a(process.cwd())]);for(const a of i){try{if(await e.stat(o(a,".git"))){const e=l(a);r.has(e.path)||(r.add(e.path),t.push({alias:e.alias,path:e.path}))}}catch{}let i=[];try{i=await e.readdir(a,{withFileTypes:!0})}catch{continue}for(const n of i){if(!n.isDirectory())continue;const i=o(a,n.name);try{if(!await e.stat(o(i,".git")))continue}catch{continue}const s=l(i);r.has(s.path)||(r.add(s.path),t.push({alias:s.alias,path:s.path}))}}return t}();if(0===t.length)return await replyToJid(r,`${waAlert("Aviso")}\nNo encontre repos nuevos cerca del directorio actual.`),!0;const i=t.map(e=>waBullet(e.alias));return await replyToJid(r,[waTitle("Repos Detectados"),"",...i].join("\n")),!0}if("/use"===p||"/cd"===p){const e=u.join(" ").trim();if(!e)return await replyToJid(r,`*Uso:* ${waCode(p+" <alias>")}`),!0;const a=await switchProcessWorkspaceByAlias(e);if(!a.ok)return await replyToJid(r,`${waAlert("Error")}\n${a.message}`),!0;if(!v(i,a.alias))return await replyToJid(r,`${waAlert("Error")}\nNo existe el repo "${e}". Usa /repos para ver aliases.`),!0;const o=d(i);return await replyToJid(r,[waTitle("Repo Activado"),"",`*Alias:* ${o?.alias??a.alias}`,`*Ruta:* ${o?.path??a.path}`,`*CWD:* ${process.cwd()}`].join("\n")),!0}if("/status"===p){const e=s(),a=d(i)??e,o=(process.env.CONTEXT_BRIDGE_RESUME_MIRROR_MODE??process.env.CONTEXT_RESUME_MIRROR_MODE??"summary").toLowerCase();return await replyToJid(r,[waTitle("Estado del Bridge"),"",`*Repo activo:* ${a.alias}`,`*Ruta:* ${a.path}`,`*Numero:* ${i}`,`*Total repos:* ${g().length}`,`*Resume mirror:* ${o}`].join("\n")),!0}if("/canal-global"===p||"/global-canal"===p||"/cg"===p){const e=(u[0]??"status").toLowerCase();if("status"===e||"estado"===e){const e=await G();return await replyToJid(r,[waTitle("Canal Global"),"","*Estado:* "+(e.running?"activo":"inactivo"),`*PID:* ${e.pid??"n/a"}`,`*Inicio:* ${e.startedAt??"n/a"}`,"","==","",waTitle("Opciones"),waBullet("/canal-global start"),waBullet("/canal-global stop"),waBullet("/canal-global status")].join("\n")),!0}if("start"===e||"iniciar"===e){const e=await I();return await replyToJid(r,`*Resultado:* ${e}`),!0}if("stop"===e||"detener"===e){const e=await _();return await replyToJid(r,`*Resultado:* ${e}`),!0}return await replyToJid(r,[waTitle("Canal Global - Ayuda"),"",waBullet("/canal-global status"),waBullet("/canal-global start"),waBullet("/canal-global stop")].join("\n")),!0}if("/aprobar"===p||"/approve"===p||"/aprobar-siempre"===p||"/approve-always"===p||"/denegar"===p||"/deny"===p){const e="/aprobar-siempre"===p||"/approve-always"===p,a="/denegar"===p||"/deny"===p,o=u.join(" ").trim();if(!o){const e=z();if(0===e.length)return await replyToJid(r,`${waAlert("Aviso")}\nNo hay permisos pendientes.`),!0;const a=e.map(e=>waBullet(`[${e.id}] ${e.toolName}: ${(e.description||"(sin detalle)").slice(0,100)}`));return await replyToJid(r,[waTitle(`Permisos pendientes (${e.length})`),"",...a,"","==","","*Uso:* /aprobar <id> o /aprobar-siempre <id> o /denegar <id>"].join("\n")),!0}const t=o.toLowerCase(),i=a?Q(t):q(t,e);if("not_found"===i.kind)return await replyToJid(r,`${waAlert("Error")}\nNo encontre ningun permiso con id "${t}". Usa /aprobar para listarlos.`),!0;if("already_resolved"===i.kind)return await replyToJid(r,`${waAlert("Aviso")}\nEl permiso ${t} (${i.item.toolName}) ya fue resuelto — ignorado.`),!0;const n=a?"rechazado":e?"aprobado permanentemente":"aprobado";return await replyToJid(r,[waTitle("Permiso Resuelto"),"",`*ID:* ${t}`,`*Herramienta:* ${i.item.toolName}`,`*Accion:* ${n}`].join("\n")),!0}if("/help"===p||"/ayuda"===p||"/ayudame"===p)return await replyToJid(r,[waTitle("Ayuda WhatsApp Bridge"),"",waBullet("/repos -> ver repos registrados"),waBullet("/use <alias> -> cambiar de repo"),waBullet("/status -> ver estado actual"),waBullet("/workspace-sync -> registrar repos git"),waBullet("/proveedores -> ver proveedores"),waBullet("/provider <nombre> -> cambiar proveedor"),waBullet("/modelo <nombre> -> cambiar modelo"),waBullet("/profiles -> ver perfiles"),waBullet("/profile <nombre> -> cambiar perfil"),waBullet("/canal-global <start|stop|status>"),waBullet("/aprobar [id] -> resolver permisos"),waBullet("/ayuda -> mostrar ayuda")].join("\n")),!0;return!1}(T,i,n);if(!t){if(M(`[wa:inbound] slash passthrough to CLI sender=${n}`),H)return H(T),void M(`[wa:inbound] injected via inboundHandler sender=${n}`);k(T),enqueueCommand({value:T,mode:"prompt",skipSlashCommands:!1,bridgeOrigin:!0}),M(`[wa:inbound] injected via enqueue fallback sender=${n}`)}})();if(H)return H($),void M(`[wa:inbound] text injected via inboundHandler sender=${n}`);if(isGlobalBridgeModeEnabled())return void runGlobalPromptFlow($.trim(),i,n);const J=$.trim();J&&(k(J),enqueueCommand({value:J,mode:"prompt",skipSlashCommands:!1,bridgeOrigin:!0}),M(`[wa:inbound] text injected via enqueue fallback sender=${n}`))}function isGlobalBridgeModeEnabled(){return"1"===process.env.CONTEXT_BRIDGE_GLOBAL_MODE}async function runGlobalPromptFlow(e,a,o){if(e)try{await replyToJid(a,"Procesando...");const t=await U(e,o);await replyToJid(a,t)}catch(e){await replyToJid(a,`Error ejecutando prompt global: ${e instanceof Error?e.message:String(e)}`)}}async function replyToJid(e,a){if(F)try{await F.sendMessage(e,{text:a})}catch{}}async function switchProcessWorkspaceByAlias(a){const o=a.trim().toLowerCase(),t=g().find(e=>e.alias.toLowerCase()===o);if(!t)return{ok:!1,message:`No existe el repo "${a}". Usa /repos para ver aliases.`};try{if(!(await e.stat(t.path)).isDirectory())return{ok:!1,message:`La ruta de ${t.alias} no es una carpeta valida: ${t.path}`}}catch{return{ok:!1,message:`La ruta de ${t.alias} no existe: ${t.path}`}}try{process.chdir(t.path)}catch(e){return{ok:!1,message:`No pude cambiar al repo ${t.alias}: ${e instanceof Error?e.message:String(e)}`}}return{ok:!0,alias:t.alias,path:t.path}}export async function startLoginWithQr(e){const a=m(),o=await B(a);if(o.jid)return{alreadyLinked:!0,selfJid:o.jid,selfE164:o.e164};F&&(T(F),F=null);const{sock:t,saveCreds:r}=await J({authDir:a,onQr:e.onQr}),i=e.timeoutMs??12e4;try{await Promise.race([E(t),new Promise((e,a)=>setTimeout(()=>a(new Error("QR timeout")),i))])}catch(e){if(515!==j(e))throw T(t),e;{T(t);const e=await J({authDir:a});try{await E(e.sock),T(e.sock)}catch{}}}T(t);try{await r()}catch{}const n=await B(a);return n.jid&&$(n.jid,n.e164),{alreadyLinked:!1,selfJid:n.jid,selfE164:n.e164}}export async function startWhatsAppBridge(){if(F)return{success:!1,message:"El bridge ya está en ejecución."};const e=m(),a=await B(e);if(!a.jid)return{success:!1,message:"WhatsApp no está vinculado. Escanea el QR desde /whatsapp primero."};try{const o=s(),t=p(),r=t?c(t):void 0;r&&await switchProcessWorkspaceByAlias(r);const{sock:i}=await J({authDir:e});await E(i),function(e){const a=e?.user?.id,o=e?.user?.lid,t=a??o;if(!t)return;const r=String(t).split("@")[0]?.split(":")[0],i=r&&/^\d+$/.test(r)?`+${r}`:void 0;$(t,i)}(i),function(e){e.ev.on("messages.upsert",a=>{if(a&&Array.isArray(a.messages))for(const o of a.messages){try{handleInbound(o)}catch{}try{const a=o?.key,t=a?.remoteJid;!a||a.fromMe||!t||t.endsWith("@g.us")||t.endsWith("@newsletter")||"function"!=typeof e.readMessages||e.readMessages([a]).catch(()=>{})}catch{}}})}(i),function(e){e.ev.on("connection.update",a=>{"close"===a?.connection&&(401===j(a.lastDisconnect?.error)?autoUnlinkOnLoggedOut():F===e&&(T(F),F=null,C(null),h(!1)))})}(i),F=i,C(i),h(!0);const n=w();return{success:!0,message:`Bridge iniciado correctamente. Cuenta: ${n?.selfE164??a.e164??"desconocido"}. Repo activo: ${o.alias}`}}catch(e){return 401===j(e)?(await autoUnlinkOnLoggedOut(),{success:!1,message:"WhatsApp reportó que la sesión fue cerrada desde el móvil. Credenciales limpiadas; ejecuta /whatsapp de nuevo para mostrar un QR fresco."}):{success:!1,message:`Error al iniciar: ${e instanceof Error?e.message:String(e)}`}}}export async function stopWhatsAppBridge(){if(!F)return{success:!1,message:"El bridge no está en ejecución."};try{return T(F),F=null,C(null),h(!1),{success:!0,message:"Bridge detenido correctamente."}}catch(e){return F=null,C(null),h(!1),{success:!1,message:`Error al detener: ${e instanceof Error?e.message:String(e)}`}}}export{r as addAllowedNumber,y as normalizeE164,n as e164ToJid};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{e164ToJid as t,getActiveWorkspaceAliasForNumber as
|
|
1
|
+
import{e164ToJid as t,getActiveWorkspaceAliasForNumber as n,getPrimaryRecipient as e}from"./config.js";import{consumeInjectedMarkIfSameOrigin as o,markInjected as s,splitForChannel as r}from"../mirrors/shared.js";import{markdownToWhatsApp as i}from"./markdown.js";const l={user:"*USER* >>",assistant:"*AI* >>",tool:"*TOOL* >>"};export function splitMessageForWhatsApp(t,n=10){if(!t)return[];const e=t.split(/\n==\n/),o=[];let s=[];for(const t of e){const e=t.trim();if(!e)continue;const r=e.split("\n");if(r.length>n){s.length>0&&(o.push(s.join("\n")),s=[]);for(let t=0;t<r.length;t+=n){const e=r.slice(t,t+n);o.push(e.join("\n"))}}else{const t=s.length>0?3:0;s.length+t+r.length>n?(o.push(s.join("\n")),s=[...r]):(s.length>0&&s.push("=="),s.push(...r))}}return s.length>0&&o.push(s.join("\n")),o.map(t=>t.trim()).filter(Boolean)}let p=null;const f=[];let h=!1;export function setMirrorSocket(t){p=t,t||(f.length=0,h=!1)}export function markInjectedFromWhatsApp(t){s(t,"whatsapp")}export function mirrorToWhatsApp(s,c){if(!p)return;if(!e())return;const a=c?.trim();a&&("user"===s&&o(a,"whatsapp")||(f.length>=200&&f.shift(),f.push({role:s,text:a}),async function(){if(h)return;h=!0;try{for(;f.length>0&&p;){const o=f.shift(),s=e();if(!s)break;const h=t(s),c=n(s),a=c?`[${c}] `:"",u=splitMessageForWhatsApp(i(`${a}${l[o.role]} ${o.text}`),10),m=[];for(const t of u){const n=r(t,4e3).filter(t=>t.trim().length>0);m.push(...n)}for(const t of m){try{await p.sendMessage(h,{text:t})}catch{continue}await sleep(500)}}}finally{h=!1}}()))}function sleep(t){return new Promise(n=>setTimeout(n,t))}
|
package/package.json
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iaforged/context-code",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.4",
|
|
4
4
|
"description": "Context Code es un asistente de desarrollo para la terminal. Puede revisar tu proyecto, editar archivos, ejecutar comandos y apoyarte en tareas reales de programacion.",
|
|
5
5
|
"author": "Context AI",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./dist/context-bootstrap.js",
|
|
10
|
+
"./core": {
|
|
11
|
+
"types": "./src/core/index.ts",
|
|
12
|
+
"default": "./dist/src/core/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
8
15
|
"bin": {
|
|
9
16
|
"context": "context-bootstrap.js",
|
|
10
17
|
"context-recovery": "context-bootstrap.js",
|
|
@@ -13,6 +20,7 @@
|
|
|
13
20
|
"engines": {
|
|
14
21
|
"node": ">=18.0.0"
|
|
15
22
|
},
|
|
23
|
+
"packageManager": "pnpm@11.1.2",
|
|
16
24
|
"files": [
|
|
17
25
|
"context-bootstrap.js",
|
|
18
26
|
"contextcode-bootstrap.js",
|
|
@@ -142,5 +150,35 @@
|
|
|
142
150
|
"@img/sharp-win32-x64": "^0.34.2",
|
|
143
151
|
"@whiskeysockets/baileys": "7.0.0-rc.9"
|
|
144
152
|
},
|
|
145
|
-
"scripts": {
|
|
146
|
-
|
|
153
|
+
"scripts": {
|
|
154
|
+
"dev": "pnpm --dir ../webapp run build && pnpm build:fast && node ./context-bootstrap.js",
|
|
155
|
+
"dev:code": "pnpm --dir ../webapp run build && pnpm build:fast && node ./contextcode-bootstrap.js",
|
|
156
|
+
"build": "tsc -p tsconfig.json && node ./scripts/postprocess-build.mjs && node ./scripts/minify-dist.mjs",
|
|
157
|
+
"build:fast": "tsc -p tsconfig.json && node ./scripts/postprocess-build.mjs",
|
|
158
|
+
"smoke:provider-parity": "pnpm build:fast && node ./dist/src/core/providers/providerParitySmoke.js",
|
|
159
|
+
"smoke:core-query-wiring": "pnpm build:fast && node ./dist/src/core/query/wiring.smoke.js",
|
|
160
|
+
"smoke:core-all": "pnpm build:fast && node ./dist/src/core/query/wiring.smoke.js && node ./dist/src/core/tools/fileResolution.smoke.js && node ./dist/src/core/tools/filesCore.smoke.js && node ./dist/src/core/tools/notebookParity.smoke.js && node ./dist/src/core/tools/imageParity.smoke.js && node ./dist/src/core/tools/pdfParity.smoke.js && node ./dist/src/core/providers/providerParitySmoke.js && node ./dist/src/core/skills/runtime.smoke.js && node ./dist/src/core/syncFlags.smoke.js && node ./dist/src/core/tasks/persistence.smoke.js",
|
|
161
|
+
"pubpackages": "bash ./scripts/pubpackages.sh",
|
|
162
|
+
"prepublishOnly": "node ./scripts/preflight-check.mjs",
|
|
163
|
+
"docs:dev": "pnpm --dir ../../docs docs:dev",
|
|
164
|
+
"docs:build": "pnpm --dir ../../docs docs:build",
|
|
165
|
+
"docs:preview": "pnpm --dir ../../docs docs:preview",
|
|
166
|
+
"docs:open": "pnpm --dir ../../docs docs:open"
|
|
167
|
+
},
|
|
168
|
+
"pnpm": {
|
|
169
|
+
"onlyBuiltDependencies": [
|
|
170
|
+
"cpu-features",
|
|
171
|
+
"ssh2"
|
|
172
|
+
]
|
|
173
|
+
},
|
|
174
|
+
"devDependencies": {
|
|
175
|
+
"@types/bun": "^1.3.14",
|
|
176
|
+
"@types/node": "^25.8.0",
|
|
177
|
+
"@types/node-notifier": "^8.0.5",
|
|
178
|
+
"@types/react": "^19.2.14",
|
|
179
|
+
"@types/react-reconciler": "^0.33.0",
|
|
180
|
+
"@types/ssh2": "^1.15.5",
|
|
181
|
+
"terser": "^5.47.1",
|
|
182
|
+
"typescript": "^5.9.3"
|
|
183
|
+
}
|
|
184
|
+
}
|