charness 3.6.0 → 3.7.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/CHANGELOG.md +274 -0
- package/DEVELOPMENT.md +31 -5
- package/MIGRATION_RENAME_TO_CHARNESS.md +3 -2
- package/README.md +84 -782
- package/SETUP.md +37 -10
- package/agent-plugin/.claude-plugin/plugin.json +7 -0
- package/agent-plugin/README.md +35 -0
- package/agent-plugin/skills/charness-delegate-claude/SKILL.md +85 -0
- package/agent-plugin/skills/charness-delegate-claude/summarize-events.py +90 -0
- package/agent-plugin/skills/charness-delegate-opencode/SKILL.md +68 -0
- package/agent-plugin/skills/charness-manager/SKILL.md +152 -0
- package/dist/adapters/adapterNames.d.ts +6 -0
- package/dist/adapters/adapterNames.d.ts.map +1 -1
- package/dist/adapters/adapterNames.js +8 -2
- package/dist/adapters/adapterNames.js.map +1 -1
- package/dist/adapters/claudeCliAdapter.d.ts +8 -0
- package/dist/adapters/claudeCliAdapter.d.ts.map +1 -1
- package/dist/adapters/claudeCliAdapter.js +42 -5
- package/dist/adapters/claudeCliAdapter.js.map +1 -1
- package/dist/adapters/claudeJsonStreamAdapter.d.ts +10 -9
- package/dist/adapters/claudeJsonStreamAdapter.d.ts.map +1 -1
- package/dist/adapters/claudeJsonStreamAdapter.js +53 -55
- package/dist/adapters/claudeJsonStreamAdapter.js.map +1 -1
- package/dist/adapters/createAdapter.d.ts +8 -0
- package/dist/adapters/createAdapter.d.ts.map +1 -1
- package/dist/adapters/createAdapter.js +14 -2
- package/dist/adapters/createAdapter.js.map +1 -1
- package/dist/adapters/openCodeAdapter.d.ts +43 -6
- package/dist/adapters/openCodeAdapter.d.ts.map +1 -1
- package/dist/adapters/openCodeAdapter.js +95 -6
- package/dist/adapters/openCodeAdapter.js.map +1 -1
- package/dist/agentLogin/agentLogin.d.ts +1 -1
- package/dist/agentLogin/agentLogin.d.ts.map +1 -1
- package/dist/apiRetryKick.d.ts +4 -3
- package/dist/apiRetryKick.d.ts.map +1 -1
- package/dist/apiRetryKick.js +16 -9
- package/dist/apiRetryKick.js.map +1 -1
- package/dist/bot.d.ts.map +1 -1
- package/dist/bot.js +1313 -381
- package/dist/bot.js.map +1 -1
- package/dist/cli/claudeProfiles.d.ts +11 -6
- package/dist/cli/claudeProfiles.d.ts.map +1 -1
- package/dist/cli/claudeProfiles.js +50 -22
- package/dist/cli/claudeProfiles.js.map +1 -1
- package/dist/cli/hot.d.ts +5 -0
- package/dist/cli/hot.d.ts.map +1 -1
- package/dist/cli/hot.js +71 -25
- package/dist/cli/hot.js.map +1 -1
- package/dist/cli/tscWatchGuard.d.ts +95 -0
- package/dist/cli/tscWatchGuard.d.ts.map +1 -0
- package/dist/cli/tscWatchGuard.js +295 -0
- package/dist/cli/tscWatchGuard.js.map +1 -0
- package/dist/cli.js +12 -1
- package/dist/cli.js.map +1 -1
- package/dist/connectors/jira/answerSink.d.ts +10 -0
- package/dist/connectors/jira/answerSink.d.ts.map +1 -1
- package/dist/connectors/jira/answerSink.js +13 -0
- package/dist/connectors/jira/answerSink.js.map +1 -1
- package/dist/connectors/jira/config.d.ts +2 -0
- package/dist/connectors/jira/config.d.ts.map +1 -1
- package/dist/connectors/jira/config.js +9 -1
- package/dist/connectors/jira/config.js.map +1 -1
- package/dist/connectors/jira/connector.d.ts +11 -1
- package/dist/connectors/jira/connector.d.ts.map +1 -1
- package/dist/connectors/jira/connector.js +13 -1
- package/dist/connectors/jira/connector.js.map +1 -1
- package/dist/connectors/jira/inbound.d.ts +29 -4
- package/dist/connectors/jira/inbound.d.ts.map +1 -1
- package/dist/connectors/jira/inbound.js +71 -8
- package/dist/connectors/jira/inbound.js.map +1 -1
- package/dist/connectors/jira/issueBlocks.d.ts +5 -0
- package/dist/connectors/jira/issueBlocks.d.ts.map +1 -1
- package/dist/connectors/jira/issueBlocks.js +11 -0
- package/dist/connectors/jira/issueBlocks.js.map +1 -1
- package/dist/connectors/jira/prompt.d.ts +4 -0
- package/dist/connectors/jira/prompt.d.ts.map +1 -1
- package/dist/connectors/jira/prompt.js +11 -2
- package/dist/connectors/jira/prompt.js.map +1 -1
- package/dist/connectors/telegram/bindPicker.d.ts +5 -0
- package/dist/connectors/telegram/bindPicker.d.ts.map +1 -1
- package/dist/connectors/telegram/bindPicker.js +18 -1
- package/dist/connectors/telegram/bindPicker.js.map +1 -1
- package/dist/connectors/telegram/bindPickerClaims.d.ts +46 -0
- package/dist/connectors/telegram/bindPickerClaims.d.ts.map +1 -0
- package/dist/connectors/telegram/bindPickerClaims.js +83 -0
- package/dist/connectors/telegram/bindPickerClaims.js.map +1 -0
- package/dist/connectors/telegram/bindSweep.d.ts +32 -0
- package/dist/connectors/telegram/bindSweep.d.ts.map +1 -0
- package/dist/connectors/telegram/bindSweep.js +47 -0
- package/dist/connectors/telegram/bindSweep.js.map +1 -0
- package/dist/connectors/telegram/bindingWelcome.d.ts +23 -0
- package/dist/connectors/telegram/bindingWelcome.d.ts.map +1 -0
- package/dist/connectors/telegram/bindingWelcome.js +26 -0
- package/dist/connectors/telegram/bindingWelcome.js.map +1 -0
- package/dist/connectors/telegram/botApiConnection.d.ts +74 -0
- package/dist/connectors/telegram/botApiConnection.d.ts.map +1 -0
- package/dist/connectors/telegram/botApiConnection.js +201 -0
- package/dist/connectors/telegram/botApiConnection.js.map +1 -0
- package/dist/connectors/telegram/commands/botCore.d.ts +8 -2
- package/dist/connectors/telegram/commands/botCore.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/botSkills.d.ts +21 -0
- package/dist/connectors/telegram/commands/botSkills.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/botSkills.js +133 -0
- package/dist/connectors/telegram/commands/botSkills.js.map +1 -0
- package/dist/connectors/telegram/commands/callbackMessage.d.ts +5 -0
- package/dist/connectors/telegram/commands/callbackMessage.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/callbackMessage.js +9 -0
- package/dist/connectors/telegram/commands/callbackMessage.js.map +1 -1
- package/dist/connectors/telegram/commands/compaction.d.ts +65 -3
- package/dist/connectors/telegram/commands/compaction.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/compaction.js +512 -94
- package/dist/connectors/telegram/commands/compaction.js.map +1 -1
- package/dist/connectors/telegram/commands/displayModes.d.ts +1 -1
- package/dist/connectors/telegram/commands/displayModes.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/displayModes.js +6 -18
- package/dist/connectors/telegram/commands/displayModes.js.map +1 -1
- package/dist/connectors/telegram/commands/fallbackChain.js +5 -5
- package/dist/connectors/telegram/commands/fallbackChain.js.map +1 -1
- package/dist/connectors/telegram/commands/reminders.d.ts +1 -1
- package/dist/connectors/telegram/commands/reminders.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/reminders.js +4 -15
- package/dist/connectors/telegram/commands/reminders.js.map +1 -1
- package/dist/connectors/telegram/commands/selfUpdate.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/selfUpdate.js +1 -11
- package/dist/connectors/telegram/commands/selfUpdate.js.map +1 -1
- package/dist/connectors/telegram/commands/taskAgents.d.ts +22 -0
- package/dist/connectors/telegram/commands/taskAgents.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/taskAgents.js +104 -0
- package/dist/connectors/telegram/commands/taskAgents.js.map +1 -0
- package/dist/connectors/telegram/commands/todo.d.ts +82 -0
- package/dist/connectors/telegram/commands/todo.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/todo.js +384 -0
- package/dist/connectors/telegram/commands/todo.js.map +1 -0
- package/dist/connectors/telegram/commands/topicCommand.d.ts +6 -2
- package/dist/connectors/telegram/commands/topicCommand.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/topicCommand.js +6 -9
- package/dist/connectors/telegram/commands/topicCommand.js.map +1 -1
- package/dist/connectors/telegram/openBindMessages.d.ts +45 -0
- package/dist/connectors/telegram/openBindMessages.d.ts.map +1 -0
- package/dist/connectors/telegram/openBindMessages.js +67 -0
- package/dist/connectors/telegram/openBindMessages.js.map +1 -0
- package/dist/connectors/telegram/outputFlushPlan.d.ts +49 -0
- package/dist/connectors/telegram/outputFlushPlan.d.ts.map +1 -1
- package/dist/connectors/telegram/outputFlushPlan.js +46 -0
- package/dist/connectors/telegram/outputFlushPlan.js.map +1 -1
- package/dist/connectors/telegram/pendingTopicName.d.ts +26 -0
- package/dist/connectors/telegram/pendingTopicName.d.ts.map +1 -0
- package/dist/connectors/telegram/pendingTopicName.js +27 -0
- package/dist/connectors/telegram/pendingTopicName.js.map +1 -0
- package/dist/connectors/test/connector.d.ts.map +1 -1
- package/dist/connectors/test/connector.js +6 -1
- package/dist/connectors/test/connector.js.map +1 -1
- package/dist/i18n/de.d.ts.map +1 -1
- package/dist/i18n/de.js +90 -7
- package/dist/i18n/de.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +90 -7
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/es.d.ts.map +1 -1
- package/dist/i18n/es.js +90 -7
- package/dist/i18n/es.js.map +1 -1
- package/dist/i18n/fr.d.ts.map +1 -1
- package/dist/i18n/fr.js +90 -7
- package/dist/i18n/fr.js.map +1 -1
- package/dist/i18n/hi.d.ts.map +1 -1
- package/dist/i18n/hi.js +90 -7
- package/dist/i18n/hi.js.map +1 -1
- package/dist/i18n/ja.d.ts.map +1 -1
- package/dist/i18n/ja.js +90 -7
- package/dist/i18n/ja.js.map +1 -1
- package/dist/i18n/ka.d.ts.map +1 -1
- package/dist/i18n/ka.js +90 -7
- package/dist/i18n/ka.js.map +1 -1
- package/dist/i18n/pt.d.ts.map +1 -1
- package/dist/i18n/pt.js +90 -7
- package/dist/i18n/pt.js.map +1 -1
- package/dist/i18n/ru.d.ts.map +1 -1
- package/dist/i18n/ru.js +90 -7
- package/dist/i18n/ru.js.map +1 -1
- package/dist/i18n/uk.d.ts.map +1 -1
- package/dist/i18n/uk.js +90 -7
- package/dist/i18n/uk.js.map +1 -1
- package/dist/i18n/uz.d.ts.map +1 -1
- package/dist/i18n/uz.js +90 -7
- package/dist/i18n/uz.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +90 -7
- package/dist/i18n/zh.js.map +1 -1
- package/dist/i18n.d.ts +1 -1
- package/dist/i18n.js +1 -1
- package/dist/installManager.d.ts +13 -0
- package/dist/installManager.d.ts.map +1 -1
- package/dist/installManager.js +38 -4
- package/dist/installManager.js.map +1 -1
- package/dist/instanceSettings.d.ts +40 -1
- package/dist/instanceSettings.d.ts.map +1 -1
- package/dist/instanceSettings.js +105 -26
- package/dist/instanceSettings.js.map +1 -1
- package/dist/openCodeQuestionFlow.d.ts +30 -0
- package/dist/openCodeQuestionFlow.d.ts.map +1 -1
- package/dist/openCodeQuestionFlow.js +43 -0
- package/dist/openCodeQuestionFlow.js.map +1 -1
- package/dist/postToSession.d.ts +20 -5
- package/dist/postToSession.d.ts.map +1 -1
- package/dist/postToSession.js +38 -7
- package/dist/postToSession.js.map +1 -1
- package/dist/remoteRun/cliArgs.d.ts +73 -0
- package/dist/remoteRun/cliArgs.d.ts.map +1 -0
- package/dist/remoteRun/cliArgs.js +197 -0
- package/dist/remoteRun/cliArgs.js.map +1 -0
- package/dist/remoteRun/commands.d.ts +56 -0
- package/dist/remoteRun/commands.d.ts.map +1 -0
- package/dist/remoteRun/commands.js +306 -0
- package/dist/remoteRun/commands.js.map +1 -0
- package/dist/remoteRun/depsPlan.d.ts +16 -0
- package/dist/remoteRun/depsPlan.d.ts.map +1 -0
- package/dist/remoteRun/depsPlan.js +82 -0
- package/dist/remoteRun/depsPlan.js.map +1 -0
- package/dist/remoteRun/exitCodes.d.ts +34 -0
- package/dist/remoteRun/exitCodes.d.ts.map +1 -0
- package/dist/remoteRun/exitCodes.js +38 -0
- package/dist/remoteRun/exitCodes.js.map +1 -0
- package/dist/remoteRun/foreground.d.ts +29 -0
- package/dist/remoteRun/foreground.d.ts.map +1 -0
- package/dist/remoteRun/foreground.js +159 -0
- package/dist/remoteRun/foreground.js.map +1 -0
- package/dist/remoteRun/interrupts.d.ts +17 -0
- package/dist/remoteRun/interrupts.d.ts.map +1 -0
- package/dist/remoteRun/interrupts.js +41 -0
- package/dist/remoteRun/interrupts.js.map +1 -0
- package/dist/remoteRun/jobFiles.d.ts +31 -0
- package/dist/remoteRun/jobFiles.d.ts.map +1 -0
- package/dist/remoteRun/jobFiles.js +84 -0
- package/dist/remoteRun/jobFiles.js.map +1 -0
- package/dist/remoteRun/jobFormat.d.ts +16 -0
- package/dist/remoteRun/jobFormat.d.ts.map +1 -0
- package/dist/remoteRun/jobFormat.js +130 -0
- package/dist/remoteRun/jobFormat.js.map +1 -0
- package/dist/remoteRun/jobId.d.ts +15 -0
- package/dist/remoteRun/jobId.d.ts.map +1 -0
- package/dist/remoteRun/jobId.js +85 -0
- package/dist/remoteRun/jobId.js.map +1 -0
- package/dist/remoteRun/jobMeta.d.ts +18 -0
- package/dist/remoteRun/jobMeta.d.ts.map +1 -0
- package/dist/remoteRun/jobMeta.js +33 -0
- package/dist/remoteRun/jobMeta.js.map +1 -0
- package/dist/remoteRun/jobQuery.d.ts +12 -0
- package/dist/remoteRun/jobQuery.d.ts.map +1 -0
- package/dist/remoteRun/jobQuery.js +22 -0
- package/dist/remoteRun/jobQuery.js.map +1 -0
- package/dist/remoteRun/jobRecords.d.ts +22 -0
- package/dist/remoteRun/jobRecords.d.ts.map +1 -0
- package/dist/remoteRun/jobRecords.js +145 -0
- package/dist/remoteRun/jobRecords.js.map +1 -0
- package/dist/remoteRun/jobState.d.ts +62 -0
- package/dist/remoteRun/jobState.d.ts.map +1 -0
- package/dist/remoteRun/jobState.js +132 -0
- package/dist/remoteRun/jobState.js.map +1 -0
- package/dist/remoteRun/leaseTiming.d.ts +18 -0
- package/dist/remoteRun/leaseTiming.d.ts.map +1 -0
- package/dist/remoteRun/leaseTiming.js +43 -0
- package/dist/remoteRun/leaseTiming.js.map +1 -0
- package/dist/remoteRun/output.d.ts +35 -0
- package/dist/remoteRun/output.d.ts.map +1 -0
- package/dist/remoteRun/output.js +82 -0
- package/dist/remoteRun/output.js.map +1 -0
- package/dist/remoteRun/pathPatterns.d.ts +33 -0
- package/dist/remoteRun/pathPatterns.d.ts.map +1 -0
- package/dist/remoteRun/pathPatterns.js +115 -0
- package/dist/remoteRun/pathPatterns.js.map +1 -0
- package/dist/remoteRun/probe.d.ts +56 -0
- package/dist/remoteRun/probe.d.ts.map +1 -0
- package/dist/remoteRun/probe.js +123 -0
- package/dist/remoteRun/probe.js.map +1 -0
- package/dist/remoteRun/project.d.ts +26 -0
- package/dist/remoteRun/project.d.ts.map +1 -0
- package/dist/remoteRun/project.js +159 -0
- package/dist/remoteRun/project.js.map +1 -0
- package/dist/remoteRun/projectConfig.d.ts +38 -0
- package/dist/remoteRun/projectConfig.d.ts.map +1 -0
- package/dist/remoteRun/projectConfig.js +87 -0
- package/dist/remoteRun/projectConfig.js.map +1 -0
- package/dist/remoteRun/remoteRunCli.d.ts +15 -0
- package/dist/remoteRun/remoteRunCli.d.ts.map +1 -0
- package/dist/remoteRun/remoteRunCli.js +144 -0
- package/dist/remoteRun/remoteRunCli.js.map +1 -0
- package/dist/remoteRun/remoteRunError.d.ts +14 -0
- package/dist/remoteRun/remoteRunError.d.ts.map +1 -0
- package/dist/remoteRun/remoteRunError.js +28 -0
- package/dist/remoteRun/remoteRunError.js.map +1 -0
- package/dist/remoteRun/rsync.d.ts +17 -0
- package/dist/remoteRun/rsync.d.ts.map +1 -0
- package/dist/remoteRun/rsync.js +39 -0
- package/dist/remoteRun/rsync.js.map +1 -0
- package/dist/remoteRun/runnerClient.d.ts +50 -0
- package/dist/remoteRun/runnerClient.d.ts.map +1 -0
- package/dist/remoteRun/runnerClient.js +139 -0
- package/dist/remoteRun/runnerClient.js.map +1 -0
- package/dist/remoteRun/runners.d.ts +57 -0
- package/dist/remoteRun/runners.d.ts.map +1 -0
- package/dist/remoteRun/runners.js +181 -0
- package/dist/remoteRun/runners.js.map +1 -0
- package/dist/remoteRun/runnersConfig.d.ts +44 -0
- package/dist/remoteRun/runnersConfig.d.ts.map +1 -0
- package/dist/remoteRun/runnersConfig.js +107 -0
- package/dist/remoteRun/runnersConfig.js.map +1 -0
- package/dist/remoteRun/safeCopy.d.ts +31 -0
- package/dist/remoteRun/safeCopy.d.ts.map +1 -0
- package/dist/remoteRun/safeCopy.js +137 -0
- package/dist/remoteRun/safeCopy.js.map +1 -0
- package/dist/remoteRun/sendPlan.d.ts +67 -0
- package/dist/remoteRun/sendPlan.d.ts.map +1 -0
- package/dist/remoteRun/sendPlan.js +139 -0
- package/dist/remoteRun/sendPlan.js.map +1 -0
- package/dist/remoteRun/ssh.d.ts +62 -0
- package/dist/remoteRun/ssh.d.ts.map +1 -0
- package/dist/remoteRun/ssh.js +202 -0
- package/dist/remoteRun/ssh.js.map +1 -0
- package/dist/remoteRun/submit.d.ts +29 -0
- package/dist/remoteRun/submit.d.ts.map +1 -0
- package/dist/remoteRun/submit.js +142 -0
- package/dist/remoteRun/submit.js.map +1 -0
- package/dist/requests/answerRequest.d.ts +5 -0
- package/dist/requests/answerRequest.d.ts.map +1 -1
- package/dist/requests/answerRequest.js +16 -1
- package/dist/requests/answerRequest.js.map +1 -1
- package/dist/requests/requestLedger.d.ts +13 -0
- package/dist/requests/requestLedger.d.ts.map +1 -1
- package/dist/requests/requestLedger.js +9 -0
- package/dist/requests/requestLedger.js.map +1 -1
- package/dist/requests/topicRequestSettle.d.ts +30 -0
- package/dist/requests/topicRequestSettle.d.ts.map +1 -0
- package/dist/requests/topicRequestSettle.js +23 -0
- package/dist/requests/topicRequestSettle.js.map +1 -0
- package/dist/requests/wakeUpEngine.d.ts +4 -0
- package/dist/requests/wakeUpEngine.d.ts.map +1 -1
- package/dist/requests/wakeUpEngine.js +5 -1
- package/dist/requests/wakeUpEngine.js.map +1 -1
- package/dist/scheduler/delivery.d.ts +2 -0
- package/dist/scheduler/delivery.d.ts.map +1 -1
- package/dist/scheduler/delivery.js +8 -4
- package/dist/scheduler/delivery.js.map +1 -1
- package/dist/scheduler/mcpSurface.d.ts +59 -10
- package/dist/scheduler/mcpSurface.d.ts.map +1 -1
- package/dist/scheduler/mcpSurface.js +276 -79
- package/dist/scheduler/mcpSurface.js.map +1 -1
- package/dist/scheduler/recurrence.d.ts +5 -0
- package/dist/scheduler/recurrence.d.ts.map +1 -1
- package/dist/scheduler/recurrence.js +12 -2
- package/dist/scheduler/recurrence.js.map +1 -1
- package/dist/scheduler/strictToolInput.d.ts +45 -0
- package/dist/scheduler/strictToolInput.d.ts.map +1 -0
- package/dist/scheduler/strictToolInput.js +155 -0
- package/dist/scheduler/strictToolInput.js.map +1 -0
- package/dist/scheduler/types.d.ts +5 -0
- package/dist/scheduler/types.d.ts.map +1 -1
- package/dist/scheduler/workerWatch.d.ts +23 -0
- package/dist/scheduler/workerWatch.d.ts.map +1 -0
- package/dist/scheduler/workerWatch.js +26 -0
- package/dist/scheduler/workerWatch.js.map +1 -0
- package/dist/selfUpdate/emittedSource.d.ts +11 -0
- package/dist/selfUpdate/emittedSource.d.ts.map +1 -0
- package/dist/selfUpdate/emittedSource.js +24 -0
- package/dist/selfUpdate/emittedSource.js.map +1 -0
- package/dist/selfUpdate/gitSource.d.ts +0 -6
- package/dist/selfUpdate/gitSource.d.ts.map +1 -1
- package/dist/selfUpdate/gitSource.js +2 -18
- package/dist/selfUpdate/gitSource.js.map +1 -1
- package/dist/selfUpdate/updatePending.d.ts +1 -1
- package/dist/sendErrorClassifier.d.ts +10 -0
- package/dist/sendErrorClassifier.d.ts.map +1 -1
- package/dist/sendErrorClassifier.js +22 -0
- package/dist/sendErrorClassifier.js.map +1 -1
- package/dist/state.d.ts +78 -7
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +125 -8
- package/dist/state.js.map +1 -1
- package/dist/stateFile.d.ts +9 -0
- package/dist/stateFile.d.ts.map +1 -0
- package/dist/stateFile.js +57 -0
- package/dist/stateFile.js.map +1 -0
- package/dist/stt/sttInstall.d.ts +7 -3
- package/dist/stt/sttInstall.d.ts.map +1 -1
- package/dist/stt/sttInstall.js +8 -4
- package/dist/stt/sttInstall.js.map +1 -1
- package/dist/stt/sttSettings.d.ts +2 -1
- package/dist/stt/sttSettings.d.ts.map +1 -1
- package/dist/stt/sttSettings.js +3 -2
- package/dist/stt/sttSettings.js.map +1 -1
- package/dist/stt/transcribeChain.js +2 -0
- package/dist/stt/transcribeChain.js.map +1 -1
- package/dist/testTimings.d.ts +13 -3
- package/dist/testTimings.d.ts.map +1 -1
- package/dist/testTimings.js +26 -2
- package/dist/testTimings.js.map +1 -1
- package/dist/todos/board.d.ts +83 -0
- package/dist/todos/board.d.ts.map +1 -0
- package/dist/todos/board.js +227 -0
- package/dist/todos/board.js.map +1 -0
- package/dist/todos/format.d.ts +33 -0
- package/dist/todos/format.d.ts.map +1 -0
- package/dist/todos/format.js +90 -0
- package/dist/todos/format.js.map +1 -0
- package/dist/todos/merge.d.ts +46 -0
- package/dist/todos/merge.d.ts.map +1 -0
- package/dist/todos/merge.js +137 -0
- package/dist/todos/merge.js.map +1 -0
- package/dist/todos/midTurn.d.ts +75 -0
- package/dist/todos/midTurn.d.ts.map +1 -0
- package/dist/todos/midTurn.js +214 -0
- package/dist/todos/midTurn.js.map +1 -0
- package/dist/todos/nag.d.ts +85 -0
- package/dist/todos/nag.d.ts.map +1 -0
- package/dist/todos/nag.js +103 -0
- package/dist/todos/nag.js.map +1 -0
- package/dist/todos/order.d.ts +25 -0
- package/dist/todos/order.d.ts.map +1 -0
- package/dist/todos/order.js +61 -0
- package/dist/todos/order.js.map +1 -0
- package/dist/todos/projects.d.ts +102 -0
- package/dist/todos/projects.d.ts.map +1 -0
- package/dist/todos/projects.js +342 -0
- package/dist/todos/projects.js.map +1 -0
- package/dist/todos/registry.d.ts +64 -0
- package/dist/todos/registry.d.ts.map +1 -0
- package/dist/todos/registry.js +116 -0
- package/dist/todos/registry.js.map +1 -0
- package/dist/todos/reminderEngine.d.ts +78 -0
- package/dist/todos/reminderEngine.d.ts.map +1 -0
- package/dist/todos/reminderEngine.js +162 -0
- package/dist/todos/reminderEngine.js.map +1 -0
- package/dist/todos/store.d.ts +34 -0
- package/dist/todos/store.d.ts.map +1 -0
- package/dist/todos/store.js +208 -0
- package/dist/todos/store.js.map +1 -0
- package/dist/todos/tools.d.ts +26 -0
- package/dist/todos/tools.d.ts.map +1 -0
- package/dist/todos/tools.js +25 -0
- package/dist/todos/tools.js.map +1 -0
- package/dist/todos/types.d.ts +85 -0
- package/dist/todos/types.d.ts.map +1 -0
- package/dist/todos/types.js +30 -0
- package/dist/todos/types.js.map +1 -0
- package/dist/trackers/taskAgentLimit.d.ts +58 -0
- package/dist/trackers/taskAgentLimit.d.ts.map +1 -0
- package/dist/trackers/taskAgentLimit.js +62 -0
- package/dist/trackers/taskAgentLimit.js.map +1 -0
- package/dist/trackers/taskAgentSlots.d.ts +109 -0
- package/dist/trackers/taskAgentSlots.d.ts.map +1 -0
- package/dist/trackers/taskAgentSlots.js +227 -0
- package/dist/trackers/taskAgentSlots.js.map +1 -0
- package/dist/trackers/types.d.ts +14 -0
- package/dist/trackers/types.d.ts.map +1 -0
- package/dist/trackers/types.js +3 -0
- package/dist/trackers/types.js.map +1 -0
- package/dist/types.d.ts +80 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/adoptReplayGate.d.ts +16 -0
- package/dist/utils/adoptReplayGate.d.ts.map +1 -0
- package/dist/utils/adoptReplayGate.js +35 -0
- package/dist/utils/adoptReplayGate.js.map +1 -0
- package/dist/utils/agentPlugin.d.ts +113 -0
- package/dist/utils/agentPlugin.d.ts.map +1 -0
- package/dist/utils/agentPlugin.js +192 -0
- package/dist/utils/agentPlugin.js.map +1 -0
- package/dist/utils/autoContinueOnLimit.d.ts +7 -4
- package/dist/utils/autoContinueOnLimit.d.ts.map +1 -1
- package/dist/utils/autoContinueOnLimit.js +8 -5
- package/dist/utils/autoContinueOnLimit.js.map +1 -1
- package/dist/utils/botSkills.d.ts +62 -0
- package/dist/utils/botSkills.d.ts.map +1 -0
- package/dist/utils/botSkills.js +53 -0
- package/dist/utils/botSkills.js.map +1 -0
- package/dist/utils/botSkillsSetting.d.ts +7 -0
- package/dist/utils/botSkillsSetting.d.ts.map +1 -0
- package/dist/utils/botSkillsSetting.js +9 -0
- package/dist/utils/botSkillsSetting.js.map +1 -0
- package/dist/utils/claudeCodeVersion.d.ts +7 -0
- package/dist/utils/claudeCodeVersion.d.ts.map +1 -1
- package/dist/utils/claudeCodeVersion.js +14 -1
- package/dist/utils/claudeCodeVersion.js.map +1 -1
- package/dist/utils/claudeCompactHook.d.ts +33 -15
- package/dist/utils/claudeCompactHook.d.ts.map +1 -1
- package/dist/utils/claudeCompactHook.js +36 -17
- package/dist/utils/claudeCompactHook.js.map +1 -1
- package/dist/utils/claudeCompactSummary.d.ts +15 -0
- package/dist/utils/claudeCompactSummary.d.ts.map +1 -0
- package/dist/utils/claudeCompactSummary.js +96 -0
- package/dist/utils/claudeCompactSummary.js.map +1 -0
- package/dist/utils/claudeLimitSwitch.d.ts +11 -9
- package/dist/utils/claudeLimitSwitch.d.ts.map +1 -1
- package/dist/utils/claudeLimitSwitch.js +18 -16
- package/dist/utils/claudeLimitSwitch.js.map +1 -1
- package/dist/utils/claudeProfiles.d.ts +5 -0
- package/dist/utils/claudeProfiles.d.ts.map +1 -1
- package/dist/utils/claudeProfiles.js +14 -0
- package/dist/utils/claudeProfiles.js.map +1 -1
- package/dist/utils/claudeSessionTitle.d.ts +2 -1
- package/dist/utils/claudeSessionTitle.d.ts.map +1 -1
- package/dist/utils/claudeSessionTitle.js +14 -14
- package/dist/utils/claudeSessionTitle.js.map +1 -1
- package/dist/utils/claudeUsage.d.ts +95 -15
- package/dist/utils/claudeUsage.d.ts.map +1 -1
- package/dist/utils/claudeUsage.js +241 -41
- package/dist/utils/claudeUsage.js.map +1 -1
- package/dist/utils/claudeUsageRefresher.d.ts +10 -0
- package/dist/utils/claudeUsageRefresher.d.ts.map +1 -1
- package/dist/utils/claudeUsageRefresher.js +11 -0
- package/dist/utils/claudeUsageRefresher.js.map +1 -1
- package/dist/utils/claudeUserEntry.d.ts +50 -0
- package/dist/utils/claudeUserEntry.d.ts.map +1 -0
- package/dist/utils/claudeUserEntry.js +120 -0
- package/dist/utils/claudeUserEntry.js.map +1 -0
- package/dist/utils/clearThreadOutputQueues.d.ts +4 -3
- package/dist/utils/clearThreadOutputQueues.d.ts.map +1 -1
- package/dist/utils/clearThreadOutputQueues.js +1 -1
- package/dist/utils/clearThreadOutputQueues.js.map +1 -1
- package/dist/utils/compactOnIdle.d.ts +33 -13
- package/dist/utils/compactOnIdle.d.ts.map +1 -1
- package/dist/utils/compactOnIdle.js +35 -15
- package/dist/utils/compactOnIdle.js.map +1 -1
- package/dist/utils/fallbackBridge.d.ts +5 -0
- package/dist/utils/fallbackBridge.d.ts.map +1 -1
- package/dist/utils/fallbackBridge.js +19 -3
- package/dist/utils/fallbackBridge.js.map +1 -1
- package/dist/utils/fallbackChain.d.ts +9 -3
- package/dist/utils/fallbackChain.d.ts.map +1 -1
- package/dist/utils/fallbackChain.js +21 -3
- package/dist/utils/fallbackChain.js.map +1 -1
- package/dist/utils/fileSendPlan.d.ts +6 -0
- package/dist/utils/fileSendPlan.d.ts.map +1 -1
- package/dist/utils/fileSendPlan.js +11 -0
- package/dist/utils/fileSendPlan.js.map +1 -1
- package/dist/utils/fileSendService.d.ts +7 -1
- package/dist/utils/fileSendService.d.ts.map +1 -1
- package/dist/utils/fileSendService.js +6 -2
- package/dist/utils/fileSendService.js.map +1 -1
- package/dist/utils/groupFinalizePlan.d.ts +8 -10
- package/dist/utils/groupFinalizePlan.d.ts.map +1 -1
- package/dist/utils/groupFinalizePlan.js +8 -12
- package/dist/utils/groupFinalizePlan.js.map +1 -1
- package/dist/utils/jsonStreamHost.d.ts +13 -0
- package/dist/utils/jsonStreamHost.d.ts.map +1 -1
- package/dist/utils/jsonStreamHost.js +13 -0
- package/dist/utils/jsonStreamHost.js.map +1 -1
- package/dist/utils/messageSendService.d.ts +5 -3
- package/dist/utils/messageSendService.d.ts.map +1 -1
- package/dist/utils/messageSendService.js +12 -5
- package/dist/utils/messageSendService.js.map +1 -1
- package/dist/utils/openCodeCompactPlugin.d.ts +39 -14
- package/dist/utils/openCodeCompactPlugin.d.ts.map +1 -1
- package/dist/utils/openCodeCompactPlugin.js +106 -38
- package/dist/utils/openCodeCompactPlugin.js.map +1 -1
- package/dist/utils/promptDelivery.d.ts +29 -12
- package/dist/utils/promptDelivery.d.ts.map +1 -1
- package/dist/utils/promptDelivery.js +13 -5
- package/dist/utils/promptDelivery.js.map +1 -1
- package/dist/utils/sentKindsSummary.d.ts +10 -0
- package/dist/utils/sentKindsSummary.d.ts.map +1 -0
- package/dist/utils/sentKindsSummary.js +18 -0
- package/dist/utils/sentKindsSummary.js.map +1 -0
- package/dist/utils/telegramError.d.ts +6 -0
- package/dist/utils/telegramError.d.ts.map +1 -1
- package/dist/utils/telegramError.js +12 -0
- package/dist/utils/telegramError.js.map +1 -1
- package/dist/utils/topicView.d.ts +1 -1
- package/dist/utils/topicView.js +1 -1
- package/dist/utils/transcribeAudio.d.ts +10 -0
- package/dist/utils/transcribeAudio.d.ts.map +1 -1
- package/dist/utils/transcribeAudio.js +22 -3
- package/dist/utils/transcribeAudio.js.map +1 -1
- package/dist/utils/transcriptErrorTime.d.ts +8 -0
- package/dist/utils/transcriptErrorTime.d.ts.map +1 -0
- package/dist/utils/transcriptErrorTime.js +56 -0
- package/dist/utils/transcriptErrorTime.js.map +1 -0
- package/dist/utils/wedgeRecovery.d.ts +2 -0
- package/dist/utils/wedgeRecovery.d.ts.map +1 -1
- package/dist/utils/wedgeRecovery.js +1 -1
- package/dist/utils/wedgeRecovery.js.map +1 -1
- package/package.json +11 -3
- package/remoteRun/runner.sh +1242 -0
- package/stt/gigaam_sidecar.py +555 -50
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @description The connections the bot keeps pooled to the Bot API, and what happens when the server closed one the bot
|
|
4
|
+
* still held.
|
|
5
|
+
*
|
|
6
|
+
* The bot keeps its connections alive and reuses them. A server closes an idle one after a while; a client that learns
|
|
7
|
+
* of it only when it writes its next request (a process starved of CPU, whose event loop has not yet read the close)
|
|
8
|
+
* gets «socket hang up» / `ECONNRESET` / `EPIPE` for a request the closed connection never delivered. Two layers:
|
|
9
|
+
*
|
|
10
|
+
* 1. The agent closes a connection that sat idle in the pool for {@link botApiFreeSocketTimeoutMs} itself, long before
|
|
11
|
+
* the server's own idle limit (api.telegram.org kept an idle HTTP/1.1 connection for more than 130 s when measured),
|
|
12
|
+
* so an ordinary pause between two sends never meets a connection the server closed. A client stalled past the
|
|
13
|
+
* server's limit cannot be helped that way: its timers do not run either, and the stale connection is still in the
|
|
14
|
+
* pool when the next request starts. What it meets then depends on the Node: since 22.23.4 the http agent looks for
|
|
15
|
+
* what the server already sent on an idle socket before it reuses it («http: ensure agent data guard works without I/O»,
|
|
16
|
+
* CVE-2026-105481) and opens a fresh connection; an older Node (`engines` allows 22.12) writes onto the closed one.
|
|
17
|
+
* 2. {@link wireBotApiClient} makes a client send such a request again ONCE, on a fresh connection — the case of those older
|
|
18
|
+
* agents, and on every Node the one of a server that closes the connection as the request is on its way, which no
|
|
19
|
+
* client sees coming. It does so only when
|
|
20
|
+
* the request rode a REUSED connection (`ClientRequest.reusedSocket`, the signal Node documents for exactly this) and
|
|
21
|
+
* the connection failed at once ({@link staleConnectionFailureWindowMs}) with the socket having read not a single byte
|
|
22
|
+
* since the reuse: no answer began, not even a partial one, and the server did not sit on the request. A timeout, an
|
|
23
|
+
* abort, an answer that began, a failure that came late and a first-time connection are never retried.
|
|
24
|
+
*
|
|
25
|
+
* This is a heuristic, not a guarantee. A server that took the request and dropped the connection at once, before a byte of
|
|
26
|
+
* its answer, looks the same to the client, and there the retry posts the message twice. That case is rare; the alternative
|
|
27
|
+
* is losing the message every time a pooled connection had been closed.
|
|
28
|
+
*/
|
|
29
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
30
|
+
if (k2 === undefined) k2 = k;
|
|
31
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
32
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
33
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
34
|
+
}
|
|
35
|
+
Object.defineProperty(o, k2, desc);
|
|
36
|
+
}) : (function(o, m, k, k2) {
|
|
37
|
+
if (k2 === undefined) k2 = k;
|
|
38
|
+
o[k2] = m[k];
|
|
39
|
+
}));
|
|
40
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
41
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
42
|
+
}) : function(o, v) {
|
|
43
|
+
o["default"] = v;
|
|
44
|
+
});
|
|
45
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
46
|
+
var ownKeys = function(o) {
|
|
47
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
48
|
+
var ar = [];
|
|
49
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
50
|
+
return ar;
|
|
51
|
+
};
|
|
52
|
+
return ownKeys(o);
|
|
53
|
+
};
|
|
54
|
+
return function (mod) {
|
|
55
|
+
if (mod && mod.__esModule) return mod;
|
|
56
|
+
var result = {};
|
|
57
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
58
|
+
__setModuleDefault(result, mod);
|
|
59
|
+
return result;
|
|
60
|
+
};
|
|
61
|
+
})();
|
|
62
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
63
|
+
exports.reusedConnectionRetryLogPrefix = exports.staleConnectionFailureWindowMs = exports.botApiFreeSocketTimeoutMs = void 0;
|
|
64
|
+
exports.createBotApiHttpsAgent = createBotApiHttpsAgent;
|
|
65
|
+
exports.createBotApiHttpAgent = createBotApiHttpAgent;
|
|
66
|
+
exports.wireBotApiClient = wireBotApiClient;
|
|
67
|
+
const http = __importStar(require("http"));
|
|
68
|
+
const https = __importStar(require("https"));
|
|
69
|
+
const async_hooks_1 = require("async_hooks");
|
|
70
|
+
const net_1 = require("net");
|
|
71
|
+
const perf_hooks_1 = require("perf_hooks");
|
|
72
|
+
const stream_1 = require("stream");
|
|
73
|
+
const sendErrorClassifier_1 = require("../../sendErrorClassifier");
|
|
74
|
+
/**
|
|
75
|
+
* @description How long a connection may idle in the pool before the agent closes it. Well under the server's own limit
|
|
76
|
+
* (the real Bot API held an idle HTTP/1.1 connection for more than 130 s when measured, and sends no `Keep-Alive` hint),
|
|
77
|
+
* long enough to span the pauses between a topic's sends and the typing indicator, so a streaming reply keeps its warm
|
|
78
|
+
* connection.
|
|
79
|
+
*
|
|
80
|
+
* It is a socket idle timeout, applied by Node only to FREE sockets (`http.Agent` destroys a socket on `timeout` only if
|
|
81
|
+
* it sits in the free list): a long poll that waits 50 s for an update is not cut.
|
|
82
|
+
*/
|
|
83
|
+
exports.botApiFreeSocketTimeoutMs = 30_000;
|
|
84
|
+
/** The initial delay of the TCP keep-alive probes on a pooled connection. */
|
|
85
|
+
const tcpKeepAliveInitialDelayMs = 10_000;
|
|
86
|
+
/**
|
|
87
|
+
* @description How soon after a pooled connection was handed to a request its failure still counts as "the server had
|
|
88
|
+
* closed it". A closed connection fails within one turn of the event loop of the write — milliseconds, a second on a host
|
|
89
|
+
* that is starved of CPU —, while a server that took the request, worked on it for long and then dropped the connection
|
|
90
|
+
* (a slow send under load, a media group, a middlebox) fails later: that request is not retried.
|
|
91
|
+
*/
|
|
92
|
+
exports.staleConnectionFailureWindowMs = 1000;
|
|
93
|
+
/** The log line of a retry: `<prefix> (<method>): …`. Never carries the bot token. */
|
|
94
|
+
exports.reusedConnectionRetryLogPrefix = '[telegram] pooled connection was closed by the server, retrying once on a fresh one';
|
|
95
|
+
/** How deep a payload is searched for a one-shot stream (`{ media: [{ media: { source: stream } }] }` is the deepest shape). */
|
|
96
|
+
const maxPayloadDepth = 5;
|
|
97
|
+
/**
|
|
98
|
+
* The probe of the `callApi` that is running, handed to the agent through the async context: node-fetch sits between the
|
|
99
|
+
* two and keeps nothing of the request on the error it throws.
|
|
100
|
+
*/
|
|
101
|
+
const reuseProbeStorage = new async_hooks_1.AsyncLocalStorage();
|
|
102
|
+
/**
|
|
103
|
+
* Mark the running `callApi`'s probe when this reused request fails at once ({@link staleConnectionFailureWindowMs}) with the
|
|
104
|
+
* socket having read nothing since the reuse. The socket's byte count, not the request's `response` event, is the test for
|
|
105
|
+
* "nothing": that event fires only once a whole response head is parsed, so a connection that delivered half a head — an
|
|
106
|
+
* answer that began — would pass for a closed one. `bytesRead` is the bytes of the application stream on a TLS socket too (a
|
|
107
|
+
* `close_notify` alert is not counted).
|
|
108
|
+
*/
|
|
109
|
+
function watchReusedRequest(socket, request) {
|
|
110
|
+
const probe = reuseProbeStorage.getStore();
|
|
111
|
+
if (!probe || !(socket instanceof net_1.Socket))
|
|
112
|
+
return;
|
|
113
|
+
const bytesReadAtReuse = socket.bytesRead;
|
|
114
|
+
const reusedAtMs = perf_hooks_1.performance.now();
|
|
115
|
+
request.once('error', () => {
|
|
116
|
+
const isAtOnce = perf_hooks_1.performance.now() - reusedAtMs <= exports.staleConnectionFailureWindowMs;
|
|
117
|
+
if (isAtOnce && socket.bytesRead === bytesReadAtReuse)
|
|
118
|
+
probe.isPooledConnectionLost = true;
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/** `agent.reuseSocket` is called by Node, synchronously inside `http.request`, when a pooled socket is handed to a request. */
|
|
122
|
+
function trackReusedConnections(agent) {
|
|
123
|
+
const reuseSocket = agent.reuseSocket.bind(agent);
|
|
124
|
+
agent.reuseSocket = (socket, request) => {
|
|
125
|
+
reuseSocket(socket, request);
|
|
126
|
+
watchReusedRequest(socket, request);
|
|
127
|
+
};
|
|
128
|
+
return agent;
|
|
129
|
+
}
|
|
130
|
+
/** The pooling both agents share. `freeSocketTimeoutMs` is a test seam; production keeps {@link botApiFreeSocketTimeoutMs}. */
|
|
131
|
+
function getBotApiAgentOptions(freeSocketTimeoutMs) {
|
|
132
|
+
return { keepAlive: true, keepAliveMsecs: tcpKeepAliveInitialDelayMs, family: 4, timeout: freeSocketTimeoutMs };
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* @description The keep-alive, IPv4-pinned `https.Agent` the Bot API client and the file downloads ride: a warm
|
|
136
|
+
* connection avoids the cold-handshake stall.
|
|
137
|
+
*/
|
|
138
|
+
function createBotApiHttpsAgent(freeSocketTimeoutMs = exports.botApiFreeSocketTimeoutMs) {
|
|
139
|
+
return trackReusedConnections(new https.Agent(getBotApiAgentOptions(freeSocketTimeoutMs)));
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* @description The same pooling for an `http://` API root (the process-level tests' fake on loopback): Telegraf drops its
|
|
143
|
+
* agent for such a root and node-fetch then falls back to the global agent, which has other limits.
|
|
144
|
+
*/
|
|
145
|
+
function createBotApiHttpAgent(freeSocketTimeoutMs = exports.botApiFreeSocketTimeoutMs) {
|
|
146
|
+
return trackReusedConnections(new http.Agent(getBotApiAgentOptions(freeSocketTimeoutMs)));
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* A file handed to Telegraf as a stream can be read once: sending the payload again would upload what is left of it. Also
|
|
150
|
+
* skips a Buffer (its bytes are not walked) and bounds the walk.
|
|
151
|
+
*/
|
|
152
|
+
function checkIsPayloadReplayable(payload, depth = 0) {
|
|
153
|
+
if (payload instanceof stream_1.Readable)
|
|
154
|
+
return false;
|
|
155
|
+
if (ArrayBuffer.isView(payload) || depth >= maxPayloadDepth)
|
|
156
|
+
return true;
|
|
157
|
+
return Object.values(payload).every((value) => typeof value !== 'object' || value === null || checkIsPayloadReplayable(value, depth + 1));
|
|
158
|
+
}
|
|
159
|
+
/** Close every idle pooled connection: one that went stale was idle just as long as its siblings, so a retry must not meet another. */
|
|
160
|
+
function destroyFreeSockets(agent) {
|
|
161
|
+
for (const sockets of Object.values(agent.freeSockets)) {
|
|
162
|
+
for (const socket of [...(sockets ?? [])])
|
|
163
|
+
socket.destroy();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Wrap `host.callApi` so a request that rode a reused connection and was dropped before any byte of an answer is sent again
|
|
168
|
+
* ONCE on a fresh connection (see the module description for what that does and does not guarantee). A second failure is the
|
|
169
|
+
* caller's, as before. `agent` is the one `host` sends through. Sits BELOW the send queue, the global pacer and the 429
|
|
170
|
+
* retry — the retry takes no permit, the thread's order is kept — and above the output trace, which therefore shows both
|
|
171
|
+
* attempts.
|
|
172
|
+
*/
|
|
173
|
+
function installReusedConnectionRetry(host, agent) {
|
|
174
|
+
const originalCallApi = host.callApi.bind(host);
|
|
175
|
+
host.callApi = async (method, payload, options) => {
|
|
176
|
+
const probe = { isPooledConnectionLost: false };
|
|
177
|
+
try {
|
|
178
|
+
return await reuseProbeStorage.run(probe, () => originalCallApi(method, payload, options));
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
const isRetryable = probe.isPooledConnectionLost && (0, sendErrorClassifier_1.checkIsConnectionResetError)(error) && checkIsPayloadReplayable(payload);
|
|
182
|
+
if (!isRetryable)
|
|
183
|
+
throw error;
|
|
184
|
+
console.warn(`${exports.reusedConnectionRetryLogPrefix} (${method})`);
|
|
185
|
+
destroyFreeSockets(agent);
|
|
186
|
+
return originalCallApi(method, payload, options);
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* @description Put the bot's pooling on a Telegraf client: its agent (Telegraf drops the agent of an `http://` root, and
|
|
192
|
+
* builds every client from options that already lack it) and the retry of a request that met a closed pooled connection.
|
|
193
|
+
* Telegraf builds a NEW client for every update (`ctx.telegram`, behind `ctx.reply` / `ctx.answerCbQuery` /
|
|
194
|
+
* `ctx.editMessageText`), so this runs once for `bot.telegram` and once per update for `ctx.telegram`. For `bot.telegram`
|
|
195
|
+
* call it AFTER the output trace wrap, so the trace records both attempts of a retried request.
|
|
196
|
+
*/
|
|
197
|
+
function wireBotApiClient(telegram, agent) {
|
|
198
|
+
telegram.options.agent = agent;
|
|
199
|
+
installReusedConnectionRetry(telegram, agent);
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=botApiConnection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"botApiConnection.js","sourceRoot":"","sources":["../../../src/connectors/telegram/botApiConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* members it uses (`Pick<BotCore, …>`), and `bot.ts` builds the one object that satisfies them all.
|
|
5
5
|
*/
|
|
6
6
|
import type { Context, NarrowedContext, Telegraf } from 'telegraf';
|
|
7
|
-
import type { Message, Update } from 'telegraf/typings/core/types/typegram';
|
|
7
|
+
import type { InlineKeyboardMarkup, Message, Update } from 'telegraf/typings/core/types/typegram';
|
|
8
8
|
import type { InboundCommand } from '../../../platform/inbound';
|
|
9
9
|
import type { SessionKey } from '../../../sessionKey';
|
|
10
10
|
import type { StateStore } from '../../../state';
|
|
@@ -26,7 +26,13 @@ export interface BotCore {
|
|
|
26
26
|
}) => Promise<number | null>;
|
|
27
27
|
/** Edit a message of the topic in place; `false` when the edit failed. */
|
|
28
28
|
editThreadMessage: (key: SessionKey, messageId: number, text: string, extra?: object) => Promise<boolean>;
|
|
29
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Replace the inline keyboard of a message of the topic through the paced send queue (`null` removes it). A no-change
|
|
31
|
+
* edit is no failure; any other failure is logged under `logTag` and answered with `false`.
|
|
32
|
+
*/
|
|
33
|
+
editThreadKeyboard: (key: SessionKey, messageId: number, keyboard: InlineKeyboardMarkup | null, logTag: string) => Promise<boolean>;
|
|
34
|
+
/** Delete a message of the topic; `false` when it stayed (older than 48 hours, already gone, not a topic of Telegram). */
|
|
35
|
+
deleteThreadMessage: (key: SessionKey, messageId: number) => Promise<boolean>;
|
|
30
36
|
/** Gate a callback or message to an admin of the served group; the topic's key, or `null` when it is refused. */
|
|
31
37
|
authoriseContext: (ctx: Context) => Promise<SessionKey | null>;
|
|
32
38
|
/** Run `fn` with the topic's resolved locale for `t(…)`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"botCore.d.ts","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/botCore.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"botCore.d.ts","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/botCore.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAClG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,gFAAgF;AAChF,MAAM,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;AAEjG,wDAAwD;AACxD,MAAM,MAAM,eAAe,GAAG,CAC5B,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,KAC5F,IAAI,CAAC;AAEV,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,QAAQ,CAAC;IACd,OAAO,EAAE,eAAe,CAAC;IACzB;;;OAGG;IACH,QAAQ,EAAE,MAAM,UAAU,CAAC;IAC3B,uHAAuH;IACvH,aAAa,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1H,0EAA0E;IAC1E,iBAAiB,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1G;;;OAGG;IACH,kBAAkB,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpI,0HAA0H;IAC1H,mBAAmB,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9E,iHAAiH;IACjH,gBAAgB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC/D,4DAA4D;IAC5D,gBAAgB,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,OAAO,KAAK,OAAO,CAAC;IAC3E,cAAc,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC;IAC7C,4DAA4D;IAC5D,kBAAkB,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,6FAA6F;IAC7F,yBAAyB,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;IACrD;;;;OAIG;IACH,mBAAmB,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAClE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { SessionKey } from '../../../sessionKey';
|
|
2
|
+
import type { BotSkillsInstanceValue, BotSkillsReader } from '../../../utils/botSkills';
|
|
3
|
+
import type { BotCore } from './botCore';
|
|
4
|
+
/** What the module needs from the bot: the shared core and the two things only the composition root knows. */
|
|
5
|
+
export interface BotSkillsPorts extends Pick<BotCore, 'bot' | 'command' | 'getState' | 'replyToThread' | 'editThreadMessage' | 'authoriseContext' | 'withThreadLocale' | 'checkIsGeneral'> {
|
|
6
|
+
/** Whether the switch is on for a conversation; `null` asks for the instance value (General's, else `settings.json`'s, else ON). */
|
|
7
|
+
readBotSkills: BotSkillsReader;
|
|
8
|
+
/** The instance value with the layer it comes from (General's own choice, the settings file, the built-in default). */
|
|
9
|
+
readBotSkillsInstanceValue: () => BotSkillsInstanceValue;
|
|
10
|
+
/** Whether the topic's backend is OpenCode, whose one server serves every topic and so cannot hide the skills from one. */
|
|
11
|
+
checkIsOpenCodeTopic: (key: SessionKey) => boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* @description Build the «Bot skills» screen over its ports: `/bot_skills` and its three buttons. A tap writes the choice
|
|
15
|
+
* and edits the picker into its confirmation (a one-shot picker, like `/language`): the menu is gone once a choice is made.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createBotSkills(ports: BotSkillsPorts): {
|
|
18
|
+
registerBotSkillsCommands: () => void;
|
|
19
|
+
registerBotSkillsCallbacks: () => void;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=botSkills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"botSkills.d.ts","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/botSkills.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAA2B,sBAAsB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACjH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,8GAA8G;AAC9G,MAAM,WAAW,cACf,SAAQ,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,GAAG,eAAe,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;IAC1J,oIAAoI;IACpI,aAAa,EAAE,eAAe,CAAC;IAC/B,uHAAuH;IACvH,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;IACzD,2HAA2H;IAC3H,oBAAoB,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC;CACpD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc;qCA0Fb,IAAI;sCAeH,IAAI;EAO5C"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createBotSkills = createBotSkills;
|
|
4
|
+
/**
|
|
5
|
+
* The «Bot skills» switch — whether the skills Charness ships with its agents (`agent-plugin/`) and the hint to load the
|
|
6
|
+
* manager reach them, per topic or (in General) for the instance. See `utils/botSkills.ts` for the precedence and what OFF
|
|
7
|
+
* does, and README.md in this folder.
|
|
8
|
+
*/
|
|
9
|
+
const telegraf_1 = require("telegraf");
|
|
10
|
+
const i18n_1 = require("../../../i18n");
|
|
11
|
+
const callbackMessage_1 = require("./callbackMessage");
|
|
12
|
+
/** The picker's buttons. */
|
|
13
|
+
const botSkillsOnCallback = 'bsk_on';
|
|
14
|
+
const botSkillsOffCallback = 'bsk_off';
|
|
15
|
+
const botSkillsSameAsGeneralCallback = 'bsk_same';
|
|
16
|
+
/** The word of `/bot_skills <word>` that hands a topic back to General's value. */
|
|
17
|
+
const sameAsGeneralArgument = 'general';
|
|
18
|
+
/**
|
|
19
|
+
* @description Build the «Bot skills» screen over its ports: `/bot_skills` and its three buttons. A tap writes the choice
|
|
20
|
+
* and edits the picker into its confirmation (a one-shot picker, like `/language`): the menu is gone once a choice is made.
|
|
21
|
+
*/
|
|
22
|
+
function createBotSkills(ports) {
|
|
23
|
+
const { bot, command, getState, replyToThread, editThreadMessage, authoriseContext, withThreadLocale, checkIsGeneral, readBotSkills, readBotSkillsInstanceValue, checkIsOpenCodeTopic } = ports;
|
|
24
|
+
const formatState = (isEnabled) => (isEnabled ? (0, i18n_1.t)('botSkills.on') : (0, i18n_1.t)('botSkills.off'));
|
|
25
|
+
/**
|
|
26
|
+
* What the topic is told about the agent it has: a Claude agent keeps its skills until its next start; an OpenCode topic's
|
|
27
|
+
* skills stay listed (one server serves every topic) and only the hint changes, when that server next restarts — and it is
|
|
28
|
+
* shared with the OpenCode topics of the same folder.
|
|
29
|
+
*/
|
|
30
|
+
const getAgentNote = (key) => (checkIsOpenCodeTopic(key) ? (0, i18n_1.t)('botSkills.openCodeTopicNote') : (0, i18n_1.t)('botSkills.runningAgentNote'));
|
|
31
|
+
const instanceSourceKeys = {
|
|
32
|
+
general: 'botSkills.instanceSourceGeneral',
|
|
33
|
+
settingsFile: 'botSkills.instanceSourceSettingsFile',
|
|
34
|
+
builtInDefault: 'botSkills.instanceSourceBuiltIn',
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* @description Write a choice and RETURN the confirmation — the one write path behind the typed form and the buttons.
|
|
38
|
+
* General: the instance value (`null` — «as in General» — is not offered there and changes nothing). A topic: its own
|
|
39
|
+
* choice, `null` drops it.
|
|
40
|
+
*/
|
|
41
|
+
async function applyBotSkills(key, isGeneral, choice) {
|
|
42
|
+
if (isGeneral) {
|
|
43
|
+
if (choice !== null)
|
|
44
|
+
await getState().setBotSkillsGlobalValue(choice);
|
|
45
|
+
return (0, i18n_1.t)('botSkills.setGeneralConfirmation', { state: formatState(readBotSkills(null)) });
|
|
46
|
+
}
|
|
47
|
+
await getState().setBotSkillsOverride(key, choice);
|
|
48
|
+
const state = formatState(readBotSkills(key));
|
|
49
|
+
const confirmation = choice === null ? (0, i18n_1.t)('botSkills.followGeneralConfirmation', { state }) : (0, i18n_1.t)('botSkills.setTopicConfirmation', { state });
|
|
50
|
+
// A Claude topic's note continues the confirmation's line; the OpenCode one is a paragraph of its own.
|
|
51
|
+
return checkIsOpenCodeTopic(key) ? `${confirmation}\n\n${getAgentNote(key)}` : `${confirmation} ${getAgentNote(key)}`;
|
|
52
|
+
}
|
|
53
|
+
/** The screen's text: the value in force and where it comes from, what the switch is, and what it means for the agent. */
|
|
54
|
+
function buildScreenText(key, isGeneral) {
|
|
55
|
+
if (isGeneral) {
|
|
56
|
+
const instance = readBotSkillsInstanceValue();
|
|
57
|
+
const title = (0, i18n_1.t)('botSkills.titleGeneral', { state: formatState(instance.isEnabled), source: (0, i18n_1.t)(instanceSourceKeys[instance.source]) });
|
|
58
|
+
return [title, (0, i18n_1.t)('botSkills.explanationText'), (0, i18n_1.t)('botSkills.runningAgentNote'), (0, i18n_1.t)('botSkills.generalScopeNote')].join('\n\n');
|
|
59
|
+
}
|
|
60
|
+
const source = getState().getBotSkillsOverride(key) === undefined ? (0, i18n_1.t)('botSkills.sourceGeneral') : (0, i18n_1.t)('botSkills.sourceTopic');
|
|
61
|
+
return [(0, i18n_1.t)('botSkills.titleTopic', { state: formatState(readBotSkills(key)), source }), (0, i18n_1.t)('botSkills.explanationText'), getAgentNote(key)].join('\n\n');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* The screen's buttons, the current choice marked ✓. General: On / Off on the instance value in force. A topic: On / Off
|
|
65
|
+
* and «As in General» (with the value it would give); its mark is the topic's own choice, or «As in General» when it has none.
|
|
66
|
+
*/
|
|
67
|
+
function buildKeyboard(key, isGeneral) {
|
|
68
|
+
const mark = (isCurrent) => (isCurrent ? ' ✓' : '');
|
|
69
|
+
if (isGeneral) {
|
|
70
|
+
const isEnabled = readBotSkills(null);
|
|
71
|
+
return telegraf_1.Markup.inlineKeyboard([[
|
|
72
|
+
telegraf_1.Markup.button.callback(`${(0, i18n_1.t)('botSkills.onButton')}${mark(isEnabled)}`, botSkillsOnCallback),
|
|
73
|
+
telegraf_1.Markup.button.callback(`${(0, i18n_1.t)('botSkills.offButton')}${mark(!isEnabled)}`, botSkillsOffCallback),
|
|
74
|
+
]]);
|
|
75
|
+
}
|
|
76
|
+
const own = getState().getBotSkillsOverride(key);
|
|
77
|
+
return telegraf_1.Markup.inlineKeyboard([
|
|
78
|
+
[
|
|
79
|
+
telegraf_1.Markup.button.callback(`${(0, i18n_1.t)('botSkills.onButton')}${mark(own === true)}`, botSkillsOnCallback),
|
|
80
|
+
telegraf_1.Markup.button.callback(`${(0, i18n_1.t)('botSkills.offButton')}${mark(own === false)}`, botSkillsOffCallback),
|
|
81
|
+
],
|
|
82
|
+
[telegraf_1.Markup.button.callback(`${(0, i18n_1.t)('botSkills.sameAsGeneralButton', { state: formatState(readBotSkills(null)) })}${mark(own === undefined)}`, botSkillsSameAsGeneralCallback)],
|
|
83
|
+
]);
|
|
84
|
+
}
|
|
85
|
+
/** The choice a typed argument names; `undefined` for none (the screen opens), and `general` means nothing in General. */
|
|
86
|
+
function parseChoice(argument, isGeneral) {
|
|
87
|
+
if (argument === 'on')
|
|
88
|
+
return true;
|
|
89
|
+
if (argument === 'off')
|
|
90
|
+
return false;
|
|
91
|
+
if (argument === sameAsGeneralArgument && !isGeneral)
|
|
92
|
+
return null;
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
/** A tap: apply the choice to the tapped topic (or General), then turn the picker into the confirmation. */
|
|
96
|
+
async function handleBotSkillsCallback(ctx, choice) {
|
|
97
|
+
const key = await authoriseContext(ctx);
|
|
98
|
+
if (!key) {
|
|
99
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.access_denied'));
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
await ctx.answerCbQuery();
|
|
103
|
+
await withThreadLocale(key, async () => {
|
|
104
|
+
const confirmation = await applyBotSkills(key, checkIsGeneral(key), choice);
|
|
105
|
+
const messageId = (0, callbackMessage_1.getCallbackMessageId)(ctx);
|
|
106
|
+
if (messageId === null)
|
|
107
|
+
await replyToThread(key, confirmation);
|
|
108
|
+
else if (!(await editThreadMessage(key, messageId, confirmation)))
|
|
109
|
+
console.warn('[bsk_cb] picker relabel failed');
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
function registerBotSkillsCommands() {
|
|
113
|
+
// `/bot_skills` — in General the instance value, in a topic that topic's own choice. Not gated on an adapter or a
|
|
114
|
+
// session: a topic may choose before its agent starts, and the choice is read at the agent's next start. `on` / `off`
|
|
115
|
+
// (and `general` in a topic) apply at once; bare opens the one-shot picker.
|
|
116
|
+
command('bot_skills', async (_ctx, key, parsed) => {
|
|
117
|
+
const isGeneral = checkIsGeneral(key);
|
|
118
|
+
const choice = parseChoice(parsed.args.join(' ').trim().toLowerCase(), isGeneral);
|
|
119
|
+
if (choice !== undefined) {
|
|
120
|
+
await replyToThread(key, await applyBotSkills(key, isGeneral, choice));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
await replyToThread(key, buildScreenText(key, isGeneral), buildKeyboard(key, isGeneral));
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
function registerBotSkillsCallbacks() {
|
|
127
|
+
bot.action(botSkillsOnCallback, (ctx) => handleBotSkillsCallback(ctx, true));
|
|
128
|
+
bot.action(botSkillsOffCallback, (ctx) => handleBotSkillsCallback(ctx, false));
|
|
129
|
+
bot.action(botSkillsSameAsGeneralCallback, (ctx) => handleBotSkillsCallback(ctx, null));
|
|
130
|
+
}
|
|
131
|
+
return { registerBotSkillsCommands, registerBotSkillsCallbacks };
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=botSkills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"botSkills.js","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/botSkills.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,11 @@ import type { SessionKey } from '../../../sessionKey';
|
|
|
10
10
|
* rather than resolve against another message's list.
|
|
11
11
|
*/
|
|
12
12
|
export declare function getCallbackMessageId(ctx: Context): number | null;
|
|
13
|
+
/**
|
|
14
|
+
* @description The text of the message a callback button sits on, as Telegram shows it (formatting marks resolved away), or
|
|
15
|
+
* `null` when the message carries none (a photo, a very old message). What a handler needs to rewrite a message it holds no record of.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getCallbackMessageText(ctx: Context): string | null;
|
|
13
18
|
/**
|
|
14
19
|
* @description The map key of a per-MESSAGE snapshot (the list a keyboard's indexes resolve against, the rung a
|
|
15
20
|
* question waits to add). A Telegram message id is unique only within ONE chat, so the chat (`key.space`) is part of
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callbackMessage.d.ts","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/callbackMessage.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAElF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQnJ"}
|
|
1
|
+
{"version":3,"file":"callbackMessage.d.ts","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/callbackMessage.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAEhE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAGlE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAElF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQnJ"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getCallbackMessageId = getCallbackMessageId;
|
|
4
|
+
exports.getCallbackMessageText = getCallbackMessageText;
|
|
4
5
|
exports.buildMessageSnapshotKey = buildMessageSnapshotKey;
|
|
5
6
|
exports.rememberBoundedSnapshot = rememberBoundedSnapshot;
|
|
6
7
|
/**
|
|
@@ -12,6 +13,14 @@ exports.rememberBoundedSnapshot = rememberBoundedSnapshot;
|
|
|
12
13
|
function getCallbackMessageId(ctx) {
|
|
13
14
|
return ctx.callbackQuery?.message?.message_id ?? null;
|
|
14
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* @description The text of the message a callback button sits on, as Telegram shows it (formatting marks resolved away), or
|
|
18
|
+
* `null` when the message carries none (a photo, a very old message). What a handler needs to rewrite a message it holds no record of.
|
|
19
|
+
*/
|
|
20
|
+
function getCallbackMessageText(ctx) {
|
|
21
|
+
const message = ctx.callbackQuery?.message;
|
|
22
|
+
return message !== undefined && 'text' in message ? message.text : null;
|
|
23
|
+
}
|
|
15
24
|
/**
|
|
16
25
|
* @description The map key of a per-MESSAGE snapshot (the list a keyboard's indexes resolve against, the rung a
|
|
17
26
|
* question waits to add). A Telegram message id is unique only within ONE chat, so the chat (`key.space`) is part of
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callbackMessage.js","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/callbackMessage.ts"],"names":[],"mappings":";;AAYA,oDAEC;AAOD,0DAEC;AAMD,0DAQC;
|
|
1
|
+
{"version":3,"file":"callbackMessage.js","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/callbackMessage.ts"],"names":[],"mappings":";;AAYA,oDAEC;AAMD,wDAGC;AAOD,0DAEC;AAMD,0DAQC;AAxCD;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,GAAY;IAC/C,OAAO,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,GAAY;IACjD,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC;IAC3C,OAAO,OAAO,KAAK,SAAS,IAAI,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1E,CAAC;AAED;;;;GAIG;AACH,SAAgB,uBAAuB,CAAC,GAAe,EAAE,SAAiB;IACxE,OAAO,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CAAY,SAAiC,EAAE,WAAmB,EAAE,QAAmB,EAAE,KAAa;IAC3I,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC9B,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACrC,OAAO,SAAS,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7C,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM;QAChC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -1,15 +1,53 @@
|
|
|
1
|
-
import type { AgentAdapter, PendingQuestionState } from '../../../types';
|
|
1
|
+
import type { AgentAdapter, PendingQuestionState, OpenCodeQuestion, ReAskedQuestionRecord } from '../../../types';
|
|
2
2
|
import type { SessionKey } from '../../../sessionKey';
|
|
3
3
|
import type { BotCore } from './botCore';
|
|
4
|
+
import { type QuestionEnd } from '../../../openCodeQuestionFlow';
|
|
5
|
+
import type { LatePromptOutcome } from '../../../utils/promptDelivery';
|
|
6
|
+
/**
|
|
7
|
+
* @description The question the idle compaction asks again (D1), from the moment the compaction starts to the moment the
|
|
8
|
+
* re-ask is used or closed. It goes through three phases, and the one record serves them all:
|
|
9
|
+
* - COMPACTING — the question was cleared and its old message lost its buttons; nothing is posted yet (`messageId: null`);
|
|
10
|
+
* - SENDING — the re-ask is being sent: its message exists, the bot has no id for it yet (`messageId: null`);
|
|
11
|
+
* - POSTED — the re-ask's message is known (`messageId`), its `reask_<i>` buttons live.
|
|
12
|
+
* `predecessorMessageId` is the message the question waited in before: the re-ask is always newer than it, and until the
|
|
13
|
+
* re-ask is posted the predecessor is where the question's result is written. `ending` is set when the record leaves the map
|
|
14
|
+
* as closed or answered — a re-ask that lands later ends the same way.
|
|
15
|
+
*/
|
|
16
|
+
export interface ReAskedQuestion {
|
|
17
|
+
question: OpenCodeQuestion;
|
|
18
|
+
messageId: number | null;
|
|
19
|
+
predecessorMessageId: number | null;
|
|
20
|
+
/** Whether the predecessor's result («asked again below», or the ending) is written or on its way — nothing else writes it. */
|
|
21
|
+
isPredecessorClosed: boolean;
|
|
22
|
+
/** Whether the edit that gave the predecessor its result has LANDED: what the saved state says, so a restart finishes a lost edit. */
|
|
23
|
+
isPredecessorEditLanded: boolean;
|
|
24
|
+
ending: QuestionEnd | null;
|
|
25
|
+
/** Where the re-ask's own send is: not begun, in flight (the message exists, its id is not known), or over (landed, or failed). */
|
|
26
|
+
sendPhase: 'notStarted' | 'inFlight' | 'finished';
|
|
27
|
+
/** Whether the idle fire has decided about the re-ask (posted it, or found the record taken and left it): its result has run. */
|
|
28
|
+
hasIdleResultRun: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* A typed number answered the question and its label is still on its way to the agent. The record is out of the map, but no
|
|
31
|
+
* result is written on its messages until the delivery is known (it may reach no session, and then the question is open
|
|
32
|
+
* again): a re-ask that lands meanwhile is left as it is, and the idle compaction leaves the predecessor alone.
|
|
33
|
+
*/
|
|
34
|
+
isAnswerPending: boolean;
|
|
35
|
+
}
|
|
4
36
|
/**
|
|
5
37
|
* What the compaction flow needs from the bot: the shared core, the typing indicator, the prompt path the
|
|
6
38
|
* compaction instruction goes through, and the pending-question state the idle re-ask reads and clears.
|
|
7
39
|
*/
|
|
8
|
-
export interface CompactionPorts extends Pick<BotCore, 'bot' | 'command' | 'getState' | 'replyToThread' | '
|
|
40
|
+
export interface CompactionPorts extends Pick<BotCore, 'bot' | 'command' | 'getState' | 'replyToThread' | 'editThreadKeyboard' | 'authoriseContext' | 'withThreadLocale' | 'checkIsGeneral' | 'wakeSleepingSession'> {
|
|
9
41
|
startTypingLoader: (key: SessionKey) => void;
|
|
10
42
|
forwardPromptToAgent: (key: SessionKey, adapter: AgentAdapter, text: string) => Promise<void>;
|
|
11
43
|
pendingQuestions: Map<string, PendingQuestionState>;
|
|
44
|
+
/** Clear the topic's pending question and unpin it; its message is left as it is (the idle re-ask closes it once the re-ask is posted). */
|
|
12
45
|
clearPendingQuestion: (key: SessionKey) => void;
|
|
46
|
+
/**
|
|
47
|
+
* Edit a question's message to the question as asked plus a note in place of its buttons (the text stays, the message
|
|
48
|
+
* is never deleted); resolves whether it was edited. The re-asked copy uses it with `unanswered` when its conversation ends.
|
|
49
|
+
*/
|
|
50
|
+
closeQuestionMessage: (key: SessionKey, messageId: number, question: OpenCodeQuestion, ending: QuestionEnd) => Promise<boolean>;
|
|
13
51
|
/** The idle window in force (`AGENT_IDLE_MINUTES` or the 55-minute default; L-D9). */
|
|
14
52
|
idleWindowMs: number;
|
|
15
53
|
/** Whether a usage-limit wait is armed for the topic — no compaction turn then (L-D6). */
|
|
@@ -21,6 +59,26 @@ export interface CompactionPorts extends Pick<BotCore, 'bot' | 'command' | 'getS
|
|
|
21
59
|
suspendThreadSession: (key: SessionKey) => Promise<void>;
|
|
22
60
|
/** Wake a SLEEPING per-turn session for its idle compaction (L-D7): a resume only; `true` when it is live. */
|
|
23
61
|
resumeSleepingSessionForCompaction: (key: SessionKey) => Promise<boolean>;
|
|
62
|
+
/** The adapter that runs the topic's conversation (the one a topic with no pick of its own answers to). */
|
|
63
|
+
getThreadAdapter: (key: SessionKey) => AgentAdapter;
|
|
64
|
+
/**
|
|
65
|
+
* Hand the label of an option a person chose on a re-asked question to the conversation as a fresh prompt, routed the way
|
|
66
|
+
* a typed message is (a live session gets it, a stopping one buffers it, a sleeping one is woken). Resolves where it went:
|
|
67
|
+
* `noSession` — nowhere, and the topic was told why.
|
|
68
|
+
*/
|
|
69
|
+
deliverLabel: (key: SessionKey, label: string) => Promise<LatePromptOutcome | null>;
|
|
70
|
+
/** Wake the topic's SLEEPING conversation for a prompt of its own; `true` when it is live (a start that failed has told the topic why). */
|
|
71
|
+
resumeSleepingSessionForPrompt: (key: SessionKey) => Promise<boolean>;
|
|
72
|
+
/** Whether a session of the topic is starting (or stopping), so a prompt is buffered for the one to come. */
|
|
73
|
+
checkIsStarting: (key: SessionKey) => boolean;
|
|
74
|
+
/**
|
|
75
|
+
* End a question message the bot holds no record of, when its buttons are tapped: its own text (`messageText`) stays and
|
|
76
|
+
* «not answered» takes the place of the buttons. Resolves whether the message was changed at all (the text edit or the
|
|
77
|
+
* removal of the buttons landed); when not, its buttons are still there and the next tap tries again.
|
|
78
|
+
*/
|
|
79
|
+
closeOrphanQuestionMessage: (key: SessionKey, messageId: number, messageText: string | null) => Promise<boolean>;
|
|
80
|
+
/** A person wrote in the topic: the bot-wide effects of that (the idle latch, the todo registry) — and the re-asked question's own end. */
|
|
81
|
+
notePersonActivity: (key: SessionKey) => void;
|
|
24
82
|
}
|
|
25
83
|
/**
|
|
26
84
|
* @description Build the compaction flow — `/compact`, the compact-on-idle watchdog and its deferred variant —
|
|
@@ -40,7 +98,11 @@ export declare function createCompaction(ports: CompactionPorts): {
|
|
|
40
98
|
};
|
|
41
99
|
checkIsDeferredCompactionArmed: (key: SessionKey) => boolean;
|
|
42
100
|
threadsCompacting: Set<string>;
|
|
43
|
-
|
|
101
|
+
answerReAskedQuestionByNumber: (key: SessionKey, text: string) => Promise<boolean>;
|
|
102
|
+
reAskInterruptedQuestion: (key: SessionKey, saved: ReAskedQuestionRecord) => Promise<void>;
|
|
103
|
+
restoreReAskedQuestion: (key: SessionKey, saved: ReAskedQuestionRecord) => void;
|
|
104
|
+
closeSavedReAskedQuestion: (key: SessionKey, saved: ReAskedQuestionRecord) => void;
|
|
105
|
+
closeReAskedQuestion: (key: SessionKey) => void;
|
|
44
106
|
registerCompactionCommands: () => void;
|
|
45
107
|
registerCompactionCallbacks: () => void;
|
|
46
108
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/compaction.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/compaction.ts"],"names":[],"mappings":"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"}
|