charness 0.0.0-stage → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +88 -0
- package/DEVELOPMENT.md +110 -0
- package/LICENSE +21 -0
- package/MIGRATION_1_TO_2.md +24 -0
- package/README.md +1024 -2
- package/dist/accessControl.d.ts +71 -0
- package/dist/accessControl.d.ts.map +1 -0
- package/dist/accessControl.js +108 -0
- package/dist/accessControl.js.map +1 -0
- package/dist/adapters/adapterEventRouting.d.ts +51 -0
- package/dist/adapters/adapterEventRouting.d.ts.map +1 -0
- package/dist/adapters/adapterEventRouting.js +74 -0
- package/dist/adapters/adapterEventRouting.js.map +1 -0
- package/dist/adapters/adapterNames.d.ts +19 -0
- package/dist/adapters/adapterNames.d.ts.map +1 -0
- package/dist/adapters/adapterNames.js +25 -0
- package/dist/adapters/adapterNames.js.map +1 -0
- package/dist/adapters/claudeCliAdapter.d.ts +1336 -0
- package/dist/adapters/claudeCliAdapter.d.ts.map +1 -0
- package/dist/adapters/claudeCliAdapter.js +4204 -0
- package/dist/adapters/claudeCliAdapter.js.map +1 -0
- package/dist/adapters/claudeJsonStreamAdapter.d.ts +548 -0
- package/dist/adapters/claudeJsonStreamAdapter.d.ts.map +1 -0
- package/dist/adapters/claudeJsonStreamAdapter.js +1810 -0
- package/dist/adapters/claudeJsonStreamAdapter.js.map +1 -0
- package/dist/adapters/claudePlatformFlags.d.ts +35 -0
- package/dist/adapters/claudePlatformFlags.d.ts.map +1 -0
- package/dist/adapters/claudePlatformFlags.js +46 -0
- package/dist/adapters/claudePlatformFlags.js.map +1 -0
- package/dist/adapters/createAdapter.d.ts +252 -0
- package/dist/adapters/createAdapter.d.ts.map +1 -0
- package/dist/adapters/createAdapter.js +475 -0
- package/dist/adapters/createAdapter.js.map +1 -0
- package/dist/adapters/openCodeAdapter.d.ts +1446 -0
- package/dist/adapters/openCodeAdapter.d.ts.map +1 -0
- package/dist/adapters/openCodeAdapter.js +4540 -0
- package/dist/adapters/openCodeAdapter.js.map +1 -0
- package/dist/adapters/sessionLaunchDefaults.d.ts +28 -0
- package/dist/adapters/sessionLaunchDefaults.d.ts.map +1 -0
- package/dist/adapters/sessionLaunchDefaults.js +15 -0
- package/dist/adapters/sessionLaunchDefaults.js.map +1 -0
- package/dist/adapters/terminalAdapter.d.ts +68 -0
- package/dist/adapters/terminalAdapter.d.ts.map +1 -0
- package/dist/adapters/terminalAdapter.js +371 -0
- package/dist/adapters/terminalAdapter.js.map +1 -0
- package/dist/agentLogin/agentLogin.d.ts +31 -0
- package/dist/agentLogin/agentLogin.d.ts.map +1 -0
- package/dist/agentLogin/agentLogin.js +493 -0
- package/dist/agentLogin/agentLogin.js.map +1 -0
- package/dist/agentTrigger.d.ts +28 -0
- package/dist/agentTrigger.d.ts.map +1 -0
- package/dist/agentTrigger.js +53 -0
- package/dist/agentTrigger.js.map +1 -0
- package/dist/apiErrorRetry.d.ts +209 -0
- package/dist/apiErrorRetry.d.ts.map +1 -0
- package/dist/apiErrorRetry.js +351 -0
- package/dist/apiErrorRetry.js.map +1 -0
- package/dist/apiRetryKick.d.ts +148 -0
- package/dist/apiRetryKick.d.ts.map +1 -0
- package/dist/apiRetryKick.js +158 -0
- package/dist/apiRetryKick.js.map +1 -0
- package/dist/bootClassifier.d.ts +46 -0
- package/dist/bootClassifier.d.ts.map +1 -0
- package/dist/bootClassifier.js +43 -0
- package/dist/bootClassifier.js.map +1 -0
- package/dist/bot.d.ts +207 -0
- package/dist/bot.d.ts.map +1 -0
- package/dist/bot.js +10611 -0
- package/dist/bot.js.map +1 -0
- package/dist/botFileStorage.d.ts +60 -0
- package/dist/botFileStorage.d.ts.map +1 -0
- package/dist/botFileStorage.js +205 -0
- package/dist/botFileStorage.js.map +1 -0
- package/dist/cli/applyDnsFix.d.ts +7 -0
- package/dist/cli/applyDnsFix.d.ts.map +1 -0
- package/dist/cli/applyDnsFix.js +46 -0
- package/dist/cli/applyDnsFix.js.map +1 -0
- package/dist/cli/bot.d.ts +27 -0
- package/dist/cli/bot.d.ts.map +1 -0
- package/dist/cli/bot.js +98 -0
- package/dist/cli/bot.js.map +1 -0
- package/dist/cli/botEntry.d.ts +3 -0
- package/dist/cli/botEntry.d.ts.map +1 -0
- package/dist/cli/botEntry.js +11 -0
- package/dist/cli/botEntry.js.map +1 -0
- package/dist/cli/connectorGuards.d.ts +31 -0
- package/dist/cli/connectorGuards.d.ts.map +1 -0
- package/dist/cli/connectorGuards.js +159 -0
- package/dist/cli/connectorGuards.js.map +1 -0
- package/dist/cli/envLoader.d.ts +34 -0
- package/dist/cli/envLoader.d.ts.map +1 -0
- package/dist/cli/envLoader.js +132 -0
- package/dist/cli/envLoader.js.map +1 -0
- package/dist/cli/hot.d.ts +82 -0
- package/dist/cli/hot.d.ts.map +1 -0
- package/dist/cli/hot.js +323 -0
- package/dist/cli/hot.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +130 -0
- package/dist/cli.js.map +1 -0
- package/dist/connectors/jira/adf.d.ts +72 -0
- package/dist/connectors/jira/adf.d.ts.map +1 -0
- package/dist/connectors/jira/adf.js +407 -0
- package/dist/connectors/jira/adf.js.map +1 -0
- package/dist/connectors/jira/agentBinaries.d.ts +14 -0
- package/dist/connectors/jira/agentBinaries.d.ts.map +1 -0
- package/dist/connectors/jira/agentBinaries.js +75 -0
- package/dist/connectors/jira/agentBinaries.js.map +1 -0
- package/dist/connectors/jira/answerSink.d.ts +52 -0
- package/dist/connectors/jira/answerSink.d.ts.map +1 -0
- package/dist/connectors/jira/answerSink.js +220 -0
- package/dist/connectors/jira/answerSink.js.map +1 -0
- package/dist/connectors/jira/attachmentDownload.d.ts +41 -0
- package/dist/connectors/jira/attachmentDownload.d.ts.map +1 -0
- package/dist/connectors/jira/attachmentDownload.js +92 -0
- package/dist/connectors/jira/attachmentDownload.js.map +1 -0
- package/dist/connectors/jira/attachmentTool.d.ts +43 -0
- package/dist/connectors/jira/attachmentTool.d.ts.map +1 -0
- package/dist/connectors/jira/attachmentTool.js +150 -0
- package/dist/connectors/jira/attachmentTool.js.map +1 -0
- package/dist/connectors/jira/client.d.ts +490 -0
- package/dist/connectors/jira/client.d.ts.map +1 -0
- package/dist/connectors/jira/client.js +453 -0
- package/dist/connectors/jira/client.js.map +1 -0
- package/dist/connectors/jira/config.d.ts +117 -0
- package/dist/connectors/jira/config.d.ts.map +1 -0
- package/dist/connectors/jira/config.js +350 -0
- package/dist/connectors/jira/config.js.map +1 -0
- package/dist/connectors/jira/configFile.d.ts +10 -0
- package/dist/connectors/jira/configFile.d.ts.map +1 -0
- package/dist/connectors/jira/configFile.js +50 -0
- package/dist/connectors/jira/configFile.js.map +1 -0
- package/dist/connectors/jira/connector.d.ts +68 -0
- package/dist/connectors/jira/connector.d.ts.map +1 -0
- package/dist/connectors/jira/connector.js +257 -0
- package/dist/connectors/jira/connector.js.map +1 -0
- package/dist/connectors/jira/contextLedger.d.ts +59 -0
- package/dist/connectors/jira/contextLedger.d.ts.map +1 -0
- package/dist/connectors/jira/contextLedger.js +194 -0
- package/dist/connectors/jira/contextLedger.js.map +1 -0
- package/dist/connectors/jira/contextPreamble.d.ts +18 -0
- package/dist/connectors/jira/contextPreamble.d.ts.map +1 -0
- package/dist/connectors/jira/contextPreamble.js +31 -0
- package/dist/connectors/jira/contextPreamble.js.map +1 -0
- package/dist/connectors/jira/inbound.d.ts +132 -0
- package/dist/connectors/jira/inbound.d.ts.map +1 -0
- package/dist/connectors/jira/inbound.js +316 -0
- package/dist/connectors/jira/inbound.js.map +1 -0
- package/dist/connectors/jira/issueBlocks.d.ts +51 -0
- package/dist/connectors/jira/issueBlocks.d.ts.map +1 -0
- package/dist/connectors/jira/issueBlocks.js +182 -0
- package/dist/connectors/jira/issueBlocks.js.map +1 -0
- package/dist/connectors/jira/issueContext.d.ts +25 -0
- package/dist/connectors/jira/issueContext.d.ts.map +1 -0
- package/dist/connectors/jira/issueContext.js +53 -0
- package/dist/connectors/jira/issueContext.js.map +1 -0
- package/dist/connectors/jira/issueDelta.d.ts +35 -0
- package/dist/connectors/jira/issueDelta.d.ts.map +1 -0
- package/dist/connectors/jira/issueDelta.js +50 -0
- package/dist/connectors/jira/issueDelta.js.map +1 -0
- package/dist/connectors/jira/mediaPlaceholders.d.ts +20 -0
- package/dist/connectors/jira/mediaPlaceholders.d.ts.map +1 -0
- package/dist/connectors/jira/mediaPlaceholders.js +92 -0
- package/dist/connectors/jira/mediaPlaceholders.js.map +1 -0
- package/dist/connectors/jira/outbound.d.ts +6 -0
- package/dist/connectors/jira/outbound.d.ts.map +1 -0
- package/dist/connectors/jira/outbound.js +38 -0
- package/dist/connectors/jira/outbound.js.map +1 -0
- package/dist/connectors/jira/prompt.d.ts +37 -0
- package/dist/connectors/jira/prompt.d.ts.map +1 -0
- package/dist/connectors/jira/prompt.js +99 -0
- package/dist/connectors/jira/prompt.js.map +1 -0
- package/dist/connectors/jira/promptSpill.d.ts +50 -0
- package/dist/connectors/jira/promptSpill.d.ts.map +1 -0
- package/dist/connectors/jira/promptSpill.js +157 -0
- package/dist/connectors/jira/promptSpill.js.map +1 -0
- package/dist/connectors/jira/promptText.d.ts +7 -0
- package/dist/connectors/jira/promptText.d.ts.map +1 -0
- package/dist/connectors/jira/promptText.js +26 -0
- package/dist/connectors/jira/promptText.js.map +1 -0
- package/dist/connectors/jira/sessionKeyCodec.d.ts +16 -0
- package/dist/connectors/jira/sessionKeyCodec.d.ts.map +1 -0
- package/dist/connectors/jira/sessionKeyCodec.js +101 -0
- package/dist/connectors/jira/sessionKeyCodec.js.map +1 -0
- package/dist/connectors/jira/trigger.d.ts +50 -0
- package/dist/connectors/jira/trigger.d.ts.map +1 -0
- package/dist/connectors/jira/trigger.js +93 -0
- package/dist/connectors/jira/trigger.js.map +1 -0
- package/dist/connectors/jira/triggerLog.d.ts +51 -0
- package/dist/connectors/jira/triggerLog.d.ts.map +1 -0
- package/dist/connectors/jira/triggerLog.js +78 -0
- package/dist/connectors/jira/triggerLog.js.map +1 -0
- package/dist/connectors/jira/unconfirmedPosts.d.ts +58 -0
- package/dist/connectors/jira/unconfirmedPosts.d.ts.map +1 -0
- package/dist/connectors/jira/unconfirmedPosts.js +105 -0
- package/dist/connectors/jira/unconfirmedPosts.js.map +1 -0
- package/dist/connectors/telegram/answerSink.d.ts +46 -0
- package/dist/connectors/telegram/answerSink.d.ts.map +1 -0
- package/dist/connectors/telegram/answerSink.js +71 -0
- package/dist/connectors/telegram/answerSink.js.map +1 -0
- package/dist/connectors/telegram/commands/autoContinueLimits.d.ts +31 -0
- package/dist/connectors/telegram/commands/autoContinueLimits.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/autoContinueLimits.js +142 -0
- package/dist/connectors/telegram/commands/autoContinueLimits.js.map +1 -0
- package/dist/connectors/telegram/commands/botCore.d.ts +46 -0
- package/dist/connectors/telegram/commands/botCore.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/botCore.js +3 -0
- package/dist/connectors/telegram/commands/botCore.js.map +1 -0
- package/dist/connectors/telegram/commands/callbackMessage.d.ts +12 -0
- package/dist/connectors/telegram/commands/callbackMessage.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/callbackMessage.js +13 -0
- package/dist/connectors/telegram/commands/callbackMessage.js.map +1 -0
- package/dist/connectors/telegram/commands/compaction.d.ts +47 -0
- package/dist/connectors/telegram/commands/compaction.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/compaction.js +868 -0
- package/dist/connectors/telegram/commands/compaction.js.map +1 -0
- package/dist/connectors/telegram/commands/displayModes.d.ts +13 -0
- package/dist/connectors/telegram/commands/displayModes.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/displayModes.js +335 -0
- package/dist/connectors/telegram/commands/displayModes.js.map +1 -0
- package/dist/connectors/telegram/commands/modelProviders.d.ts +95 -0
- package/dist/connectors/telegram/commands/modelProviders.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/modelProviders.js +841 -0
- package/dist/connectors/telegram/commands/modelProviders.js.map +1 -0
- package/dist/connectors/telegram/commands/reminders.d.ts +54 -0
- package/dist/connectors/telegram/commands/reminders.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/reminders.js +624 -0
- package/dist/connectors/telegram/commands/reminders.js.map +1 -0
- package/dist/connectors/telegram/fileIntake.d.ts +166 -0
- package/dist/connectors/telegram/fileIntake.d.ts.map +1 -0
- package/dist/connectors/telegram/fileIntake.js +304 -0
- package/dist/connectors/telegram/fileIntake.js.map +1 -0
- package/dist/connectors/telegram/fileSendGateway.d.ts +57 -0
- package/dist/connectors/telegram/fileSendGateway.d.ts.map +1 -0
- package/dist/connectors/telegram/fileSendGateway.js +221 -0
- package/dist/connectors/telegram/fileSendGateway.js.map +1 -0
- package/dist/connectors/telegram/foreignKeyFallbacks.d.ts +52 -0
- package/dist/connectors/telegram/foreignKeyFallbacks.d.ts.map +1 -0
- package/dist/connectors/telegram/foreignKeyFallbacks.js +71 -0
- package/dist/connectors/telegram/foreignKeyFallbacks.js.map +1 -0
- package/dist/connectors/telegram/inbound.d.ts +131 -0
- package/dist/connectors/telegram/inbound.d.ts.map +1 -0
- package/dist/connectors/telegram/inbound.js +278 -0
- package/dist/connectors/telegram/inbound.js.map +1 -0
- package/dist/connectors/telegram/languagePicker.d.ts +32 -0
- package/dist/connectors/telegram/languagePicker.d.ts.map +1 -0
- package/dist/connectors/telegram/languagePicker.js +55 -0
- package/dist/connectors/telegram/languagePicker.js.map +1 -0
- package/dist/connectors/telegram/messageSplit.d.ts +62 -0
- package/dist/connectors/telegram/messageSplit.d.ts.map +1 -0
- package/dist/connectors/telegram/messageSplit.js +119 -0
- package/dist/connectors/telegram/messageSplit.js.map +1 -0
- package/dist/connectors/telegram/outbound.d.ts +62 -0
- package/dist/connectors/telegram/outbound.d.ts.map +1 -0
- package/dist/connectors/telegram/outbound.js +116 -0
- package/dist/connectors/telegram/outbound.js.map +1 -0
- package/dist/connectors/telegram/output/createOutputTransport.d.ts +34 -0
- package/dist/connectors/telegram/output/createOutputTransport.d.ts.map +1 -0
- package/dist/connectors/telegram/output/createOutputTransport.js +77 -0
- package/dist/connectors/telegram/output/createOutputTransport.js.map +1 -0
- package/dist/connectors/telegram/output/dmOutputTransport.d.ts +47 -0
- package/dist/connectors/telegram/output/dmOutputTransport.d.ts.map +1 -0
- package/dist/connectors/telegram/output/dmOutputTransport.js +412 -0
- package/dist/connectors/telegram/output/dmOutputTransport.js.map +1 -0
- package/dist/connectors/telegram/outputBacklogGlue.d.ts +38 -0
- package/dist/connectors/telegram/outputBacklogGlue.d.ts.map +1 -0
- package/dist/connectors/telegram/outputBacklogGlue.js +49 -0
- package/dist/connectors/telegram/outputBacklogGlue.js.map +1 -0
- package/dist/connectors/telegram/outputFlushPlan.d.ts +93 -0
- package/dist/connectors/telegram/outputFlushPlan.d.ts.map +1 -0
- package/dist/connectors/telegram/outputFlushPlan.js +120 -0
- package/dist/connectors/telegram/outputFlushPlan.js.map +1 -0
- package/dist/connectors/telegram/questionKeyboards.d.ts +30 -0
- package/dist/connectors/telegram/questionKeyboards.d.ts.map +1 -0
- package/dist/connectors/telegram/questionKeyboards.js +37 -0
- package/dist/connectors/telegram/questionKeyboards.js.map +1 -0
- package/dist/connectors/telegram/renderAgentHtml.d.ts +27 -0
- package/dist/connectors/telegram/renderAgentHtml.d.ts.map +1 -0
- package/dist/connectors/telegram/renderAgentHtml.js +97 -0
- package/dist/connectors/telegram/renderAgentHtml.js.map +1 -0
- package/dist/connectors/telegram/sessionKeyCodec.d.ts +28 -0
- package/dist/connectors/telegram/sessionKeyCodec.d.ts.map +1 -0
- package/dist/connectors/telegram/sessionKeyCodec.js +107 -0
- package/dist/connectors/telegram/sessionKeyCodec.js.map +1 -0
- package/dist/connectors/telegram/telegramCallGuard.d.ts +19 -0
- package/dist/connectors/telegram/telegramCallGuard.d.ts.map +1 -0
- package/dist/connectors/telegram/telegramCallGuard.js +35 -0
- package/dist/connectors/telegram/telegramCallGuard.js.map +1 -0
- package/dist/connectors/telegram/timezonePicker.d.ts +85 -0
- package/dist/connectors/telegram/timezonePicker.d.ts.map +1 -0
- package/dist/connectors/telegram/timezonePicker.js +142 -0
- package/dist/connectors/telegram/timezonePicker.js.map +1 -0
- package/dist/connectors/telegram/updateDispatcher.d.ts +85 -0
- package/dist/connectors/telegram/updateDispatcher.d.ts.map +1 -0
- package/dist/connectors/telegram/updateDispatcher.js +159 -0
- package/dist/connectors/telegram/updateDispatcher.js.map +1 -0
- package/dist/connectors/test/connector.d.ts +52 -0
- package/dist/connectors/test/connector.d.ts.map +1 -0
- package/dist/connectors/test/connector.js +143 -0
- package/dist/connectors/test/connector.js.map +1 -0
- package/dist/connectors/test/sessionKeyCodec.d.ts +25 -0
- package/dist/connectors/test/sessionKeyCodec.d.ts.map +1 -0
- package/dist/connectors/test/sessionKeyCodec.js +50 -0
- package/dist/connectors/test/sessionKeyCodec.js.map +1 -0
- package/dist/diagLog.d.ts +6 -0
- package/dist/diagLog.d.ts.map +1 -0
- package/dist/diagLog.js +58 -0
- package/dist/diagLog.js.map +1 -0
- package/dist/effortLevels.d.ts +68 -0
- package/dist/effortLevels.d.ts.map +1 -0
- package/dist/effortLevels.js +114 -0
- package/dist/effortLevels.js.map +1 -0
- package/dist/folderName.d.ts +42 -0
- package/dist/folderName.d.ts.map +1 -0
- package/dist/folderName.js +51 -0
- package/dist/folderName.js.map +1 -0
- package/dist/i18n/de.d.ts +2 -0
- package/dist/i18n/de.d.ts.map +1 -0
- package/dist/i18n/de.js +537 -0
- package/dist/i18n/de.js.map +1 -0
- package/dist/i18n/en.d.ts +7 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +566 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/es.d.ts +2 -0
- package/dist/i18n/es.d.ts.map +1 -0
- package/dist/i18n/es.js +537 -0
- package/dist/i18n/es.js.map +1 -0
- package/dist/i18n/fr.d.ts +2 -0
- package/dist/i18n/fr.d.ts.map +1 -0
- package/dist/i18n/fr.js +537 -0
- package/dist/i18n/fr.js.map +1 -0
- package/dist/i18n/hi.d.ts +2 -0
- package/dist/i18n/hi.d.ts.map +1 -0
- package/dist/i18n/hi.js +537 -0
- package/dist/i18n/hi.js.map +1 -0
- package/dist/i18n/ja.d.ts +2 -0
- package/dist/i18n/ja.d.ts.map +1 -0
- package/dist/i18n/ja.js +537 -0
- package/dist/i18n/ja.js.map +1 -0
- package/dist/i18n/ka.d.ts +2 -0
- package/dist/i18n/ka.d.ts.map +1 -0
- package/dist/i18n/ka.js +537 -0
- package/dist/i18n/ka.js.map +1 -0
- package/dist/i18n/pt.d.ts +2 -0
- package/dist/i18n/pt.d.ts.map +1 -0
- package/dist/i18n/pt.js +537 -0
- package/dist/i18n/pt.js.map +1 -0
- package/dist/i18n/ru.d.ts +6 -0
- package/dist/i18n/ru.d.ts.map +1 -0
- package/dist/i18n/ru.js +540 -0
- package/dist/i18n/ru.js.map +1 -0
- package/dist/i18n/uk.d.ts +8 -0
- package/dist/i18n/uk.d.ts.map +1 -0
- package/dist/i18n/uk.js +542 -0
- package/dist/i18n/uk.js.map +1 -0
- package/dist/i18n/uz.d.ts +2 -0
- package/dist/i18n/uz.d.ts.map +1 -0
- package/dist/i18n/uz.js +537 -0
- package/dist/i18n/uz.js.map +1 -0
- package/dist/i18n/zh.d.ts +2 -0
- package/dist/i18n/zh.d.ts.map +1 -0
- package/dist/i18n/zh.js +537 -0
- package/dist/i18n/zh.js.map +1 -0
- package/dist/i18n.d.ts +115 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +233 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/installManager.d.ts +99 -0
- package/dist/installManager.d.ts.map +1 -0
- package/dist/installManager.js +943 -0
- package/dist/installManager.js.map +1 -0
- package/dist/instanceLock.d.ts +161 -0
- package/dist/instanceLock.d.ts.map +1 -0
- package/dist/instanceLock.js +388 -0
- package/dist/instanceLock.js.map +1 -0
- package/dist/mcpConfig.d.ts +76 -0
- package/dist/mcpConfig.d.ts.map +1 -0
- package/dist/mcpConfig.js +270 -0
- package/dist/mcpConfig.js.map +1 -0
- package/dist/openCodeOpenQuestion.d.ts +44 -0
- package/dist/openCodeOpenQuestion.d.ts.map +1 -0
- package/dist/openCodeOpenQuestion.js +64 -0
- package/dist/openCodeOpenQuestion.js.map +1 -0
- package/dist/openCodeQuestionFlow.d.ts +105 -0
- package/dist/openCodeQuestionFlow.d.ts.map +1 -0
- package/dist/openCodeQuestionFlow.js +143 -0
- package/dist/openCodeQuestionFlow.js.map +1 -0
- package/dist/openCodeSessionRouting.d.ts +133 -0
- package/dist/openCodeSessionRouting.d.ts.map +1 -0
- package/dist/openCodeSessionRouting.js +253 -0
- package/dist/openCodeSessionRouting.js.map +1 -0
- package/dist/openCodeSessionTitle.d.ts +50 -0
- package/dist/openCodeSessionTitle.d.ts.map +1 -0
- package/dist/openCodeSessionTitle.js +84 -0
- package/dist/openCodeSessionTitle.js.map +1 -0
- package/dist/outputTrace.d.ts +108 -0
- package/dist/outputTrace.d.ts.map +1 -0
- package/dist/outputTrace.js +430 -0
- package/dist/outputTrace.js.map +1 -0
- package/dist/pendingQuestionRepost.d.ts +47 -0
- package/dist/pendingQuestionRepost.d.ts.map +1 -0
- package/dist/pendingQuestionRepost.js +29 -0
- package/dist/pendingQuestionRepost.js.map +1 -0
- package/dist/pinnedStatus.d.ts +52 -0
- package/dist/pinnedStatus.d.ts.map +1 -0
- package/dist/pinnedStatus.js +36 -0
- package/dist/pinnedStatus.js.map +1 -0
- package/dist/platform/answerSink.d.ts +93 -0
- package/dist/platform/answerSink.d.ts.map +1 -0
- package/dist/platform/answerSink.js +31 -0
- package/dist/platform/answerSink.js.map +1 -0
- package/dist/platform/capabilityFallback.d.ts +39 -0
- package/dist/platform/capabilityFallback.d.ts.map +1 -0
- package/dist/platform/capabilityFallback.js +55 -0
- package/dist/platform/capabilityFallback.js.map +1 -0
- package/dist/platform/commandRouter.d.ts +51 -0
- package/dist/platform/commandRouter.d.ts.map +1 -0
- package/dist/platform/commandRouter.js +53 -0
- package/dist/platform/commandRouter.js.map +1 -0
- package/dist/platform/connectorSet.d.ts +39 -0
- package/dist/platform/connectorSet.d.ts.map +1 -0
- package/dist/platform/connectorSet.js +55 -0
- package/dist/platform/connectorSet.js.map +1 -0
- package/dist/platform/inbound.d.ts +147 -0
- package/dist/platform/inbound.d.ts.map +1 -0
- package/dist/platform/inbound.js +18 -0
- package/dist/platform/inbound.js.map +1 -0
- package/dist/platform/outbound.d.ts +225 -0
- package/dist/platform/outbound.d.ts.map +1 -0
- package/dist/platform/outbound.js +30 -0
- package/dist/platform/outbound.js.map +1 -0
- package/dist/platform/unservedStateGuard.d.ts +27 -0
- package/dist/platform/unservedStateGuard.d.ts.map +1 -0
- package/dist/platform/unservedStateGuard.js +42 -0
- package/dist/platform/unservedStateGuard.js.map +1 -0
- package/dist/postToSession.d.ts +94 -0
- package/dist/postToSession.d.ts.map +1 -0
- package/dist/postToSession.js +56 -0
- package/dist/postToSession.js.map +1 -0
- package/dist/progressLine.d.ts +180 -0
- package/dist/progressLine.d.ts.map +1 -0
- package/dist/progressLine.js +293 -0
- package/dist/progressLine.js.map +1 -0
- package/dist/rateLimiter.d.ts +246 -0
- package/dist/rateLimiter.d.ts.map +1 -0
- package/dist/rateLimiter.js +555 -0
- package/dist/rateLimiter.js.map +1 -0
- package/dist/requests/answerRequest.d.ts +57 -0
- package/dist/requests/answerRequest.d.ts.map +1 -0
- package/dist/requests/answerRequest.js +96 -0
- package/dist/requests/answerRequest.js.map +1 -0
- package/dist/requests/answerTail.d.ts +83 -0
- package/dist/requests/answerTail.d.ts.map +1 -0
- package/dist/requests/answerTail.js +102 -0
- package/dist/requests/answerTail.js.map +1 -0
- package/dist/requests/limitWaitAnswer.d.ts +87 -0
- package/dist/requests/limitWaitAnswer.d.ts.map +1 -0
- package/dist/requests/limitWaitAnswer.js +83 -0
- package/dist/requests/limitWaitAnswer.js.map +1 -0
- package/dist/requests/requestGroup.d.ts +44 -0
- package/dist/requests/requestGroup.d.ts.map +1 -0
- package/dist/requests/requestGroup.js +63 -0
- package/dist/requests/requestGroup.js.map +1 -0
- package/dist/requests/requestHeader.d.ts +70 -0
- package/dist/requests/requestHeader.d.ts.map +1 -0
- package/dist/requests/requestHeader.js +83 -0
- package/dist/requests/requestHeader.js.map +1 -0
- package/dist/requests/requestLedger.d.ts +217 -0
- package/dist/requests/requestLedger.d.ts.map +1 -0
- package/dist/requests/requestLedger.js +468 -0
- package/dist/requests/requestLedger.js.map +1 -0
- package/dist/requests/sessionTurnProbe.d.ts +52 -0
- package/dist/requests/sessionTurnProbe.d.ts.map +1 -0
- package/dist/requests/sessionTurnProbe.js +29 -0
- package/dist/requests/sessionTurnProbe.js.map +1 -0
- package/dist/requests/types.d.ts +181 -0
- package/dist/requests/types.d.ts.map +1 -0
- package/dist/requests/types.js +9 -0
- package/dist/requests/types.js.map +1 -0
- package/dist/requests/wakeUpEngine.d.ts +160 -0
- package/dist/requests/wakeUpEngine.d.ts.map +1 -0
- package/dist/requests/wakeUpEngine.js +399 -0
- package/dist/requests/wakeUpEngine.js.map +1 -0
- package/dist/requests/wakeUpRules.d.ts +151 -0
- package/dist/requests/wakeUpRules.d.ts.map +1 -0
- package/dist/requests/wakeUpRules.js +167 -0
- package/dist/requests/wakeUpRules.js.map +1 -0
- package/dist/resumeContext.d.ts +87 -0
- package/dist/resumeContext.d.ts.map +1 -0
- package/dist/resumeContext.js +114 -0
- package/dist/resumeContext.js.map +1 -0
- package/dist/scheduler/checkRun.d.ts +95 -0
- package/dist/scheduler/checkRun.d.ts.map +1 -0
- package/dist/scheduler/checkRun.js +172 -0
- package/dist/scheduler/checkRun.js.map +1 -0
- package/dist/scheduler/delivery.d.ts +99 -0
- package/dist/scheduler/delivery.d.ts.map +1 -0
- package/dist/scheduler/delivery.js +212 -0
- package/dist/scheduler/delivery.js.map +1 -0
- package/dist/scheduler/deliveryKind.d.ts +29 -0
- package/dist/scheduler/deliveryKind.d.ts.map +1 -0
- package/dist/scheduler/deliveryKind.js +39 -0
- package/dist/scheduler/deliveryKind.js.map +1 -0
- package/dist/scheduler/directoryThreads.d.ts +19 -0
- package/dist/scheduler/directoryThreads.d.ts.map +1 -0
- package/dist/scheduler/directoryThreads.js +28 -0
- package/dist/scheduler/directoryThreads.js.map +1 -0
- package/dist/scheduler/engine.d.ts +77 -0
- package/dist/scheduler/engine.d.ts.map +1 -0
- package/dist/scheduler/engine.js +337 -0
- package/dist/scheduler/engine.js.map +1 -0
- package/dist/scheduler/injection.d.ts +102 -0
- package/dist/scheduler/injection.d.ts.map +1 -0
- package/dist/scheduler/injection.js +122 -0
- package/dist/scheduler/injection.js.map +1 -0
- package/dist/scheduler/mcpBoot.d.ts +65 -0
- package/dist/scheduler/mcpBoot.d.ts.map +1 -0
- package/dist/scheduler/mcpBoot.js +60 -0
- package/dist/scheduler/mcpBoot.js.map +1 -0
- package/dist/scheduler/mcpSurface.d.ts +355 -0
- package/dist/scheduler/mcpSurface.d.ts.map +1 -0
- package/dist/scheduler/mcpSurface.js +1257 -0
- package/dist/scheduler/mcpSurface.js.map +1 -0
- package/dist/scheduler/rebindResume.d.ts +27 -0
- package/dist/scheduler/rebindResume.d.ts.map +1 -0
- package/dist/scheduler/rebindResume.js +17 -0
- package/dist/scheduler/rebindResume.js.map +1 -0
- package/dist/scheduler/recurrence.d.ts +58 -0
- package/dist/scheduler/recurrence.d.ts.map +1 -0
- package/dist/scheduler/recurrence.js +210 -0
- package/dist/scheduler/recurrence.js.map +1 -0
- package/dist/scheduler/runLedger.d.ts +59 -0
- package/dist/scheduler/runLedger.d.ts.map +1 -0
- package/dist/scheduler/runLedger.js +54 -0
- package/dist/scheduler/runLedger.js.map +1 -0
- package/dist/scheduler/store.d.ts +97 -0
- package/dist/scheduler/store.d.ts.map +1 -0
- package/dist/scheduler/store.js +124 -0
- package/dist/scheduler/store.js.map +1 -0
- package/dist/scheduler/timezoneRecompute.d.ts +61 -0
- package/dist/scheduler/timezoneRecompute.d.ts.map +1 -0
- package/dist/scheduler/timezoneRecompute.js +46 -0
- package/dist/scheduler/timezoneRecompute.js.map +1 -0
- package/dist/scheduler/types.d.ts +139 -0
- package/dist/scheduler/types.d.ts.map +1 -0
- package/dist/scheduler/types.js +8 -0
- package/dist/scheduler/types.js.map +1 -0
- package/dist/sendErrorClassifier.d.ts +45 -0
- package/dist/sendErrorClassifier.d.ts.map +1 -0
- package/dist/sendErrorClassifier.js +65 -0
- package/dist/sendErrorClassifier.js.map +1 -0
- package/dist/sessionKey.d.ts +136 -0
- package/dist/sessionKey.d.ts.map +1 -0
- package/dist/sessionKey.js +153 -0
- package/dist/sessionKey.js.map +1 -0
- package/dist/sessionPick.d.ts +42 -0
- package/dist/sessionPick.d.ts.map +1 -0
- package/dist/sessionPick.js +39 -0
- package/dist/sessionPick.js.map +1 -0
- package/dist/shutdown.d.ts +126 -0
- package/dist/shutdown.d.ts.map +1 -0
- package/dist/shutdown.js +164 -0
- package/dist/shutdown.js.map +1 -0
- package/dist/startupPromptBuffer.d.ts +85 -0
- package/dist/startupPromptBuffer.d.ts.map +1 -0
- package/dist/startupPromptBuffer.js +123 -0
- package/dist/startupPromptBuffer.js.map +1 -0
- package/dist/state.d.ts +1245 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +1830 -0
- package/dist/state.js.map +1 -0
- package/dist/threadContextPreamble.d.ts +89 -0
- package/dist/threadContextPreamble.d.ts.map +1 -0
- package/dist/threadContextPreamble.js +102 -0
- package/dist/threadContextPreamble.js.map +1 -0
- package/dist/threadRouting.d.ts +164 -0
- package/dist/threadRouting.d.ts.map +1 -0
- package/dist/threadRouting.js +182 -0
- package/dist/threadRouting.js.map +1 -0
- package/dist/types.d.ts +1015 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/abortableFifo.d.ts +10 -0
- package/dist/utils/abortableFifo.d.ts.map +1 -0
- package/dist/utils/abortableFifo.js +55 -0
- package/dist/utils/abortableFifo.js.map +1 -0
- package/dist/utils/adoptedToolList.d.ts +27 -0
- package/dist/utils/adoptedToolList.d.ts.map +1 -0
- package/dist/utils/adoptedToolList.js +22 -0
- package/dist/utils/adoptedToolList.js.map +1 -0
- package/dist/utils/agentEnvironment.d.ts +42 -0
- package/dist/utils/agentEnvironment.d.ts.map +1 -0
- package/dist/utils/agentEnvironment.js +122 -0
- package/dist/utils/agentEnvironment.js.map +1 -0
- package/dist/utils/ansiClean.d.ts +11 -0
- package/dist/utils/ansiClean.d.ts.map +1 -0
- package/dist/utils/ansiClean.js +139 -0
- package/dist/utils/ansiClean.js.map +1 -0
- package/dist/utils/autoContinueOnLimit.d.ts +49 -0
- package/dist/utils/autoContinueOnLimit.d.ts.map +1 -0
- package/dist/utils/autoContinueOnLimit.js +69 -0
- package/dist/utils/autoContinueOnLimit.js.map +1 -0
- package/dist/utils/canonicalPathContainment.d.ts +7 -0
- package/dist/utils/canonicalPathContainment.d.ts.map +1 -0
- package/dist/utils/canonicalPathContainment.js +48 -0
- package/dist/utils/canonicalPathContainment.js.map +1 -0
- package/dist/utils/claudeAuthLogin.d.ts +71 -0
- package/dist/utils/claudeAuthLogin.d.ts.map +1 -0
- package/dist/utils/claudeAuthLogin.js +93 -0
- package/dist/utils/claudeAuthLogin.js.map +1 -0
- package/dist/utils/claudeChunkClassifier.d.ts +97 -0
- package/dist/utils/claudeChunkClassifier.d.ts.map +1 -0
- package/dist/utils/claudeChunkClassifier.js +254 -0
- package/dist/utils/claudeChunkClassifier.js.map +1 -0
- package/dist/utils/claudeCodeVersion.d.ts +31 -0
- package/dist/utils/claudeCodeVersion.d.ts.map +1 -0
- package/dist/utils/claudeCodeVersion.js +62 -0
- package/dist/utils/claudeCodeVersion.js.map +1 -0
- package/dist/utils/claudeCompactHook.d.ts +64 -0
- package/dist/utils/claudeCompactHook.d.ts.map +1 -0
- package/dist/utils/claudeCompactHook.js +98 -0
- package/dist/utils/claudeCompactHook.js.map +1 -0
- package/dist/utils/claudeLivenessAction.d.ts +208 -0
- package/dist/utils/claudeLivenessAction.d.ts.map +1 -0
- package/dist/utils/claudeLivenessAction.js +135 -0
- package/dist/utils/claudeLivenessAction.js.map +1 -0
- package/dist/utils/claudeMcpHeal.d.ts +92 -0
- package/dist/utils/claudeMcpHeal.d.ts.map +1 -0
- package/dist/utils/claudeMcpHeal.js +91 -0
- package/dist/utils/claudeMcpHeal.js.map +1 -0
- package/dist/utils/claudeRelayRouting.d.ts +86 -0
- package/dist/utils/claudeRelayRouting.d.ts.map +1 -0
- package/dist/utils/claudeRelayRouting.js +159 -0
- package/dist/utils/claudeRelayRouting.js.map +1 -0
- package/dist/utils/claudeRuntimeInfo.d.ts +26 -0
- package/dist/utils/claudeRuntimeInfo.d.ts.map +1 -0
- package/dist/utils/claudeRuntimeInfo.js +151 -0
- package/dist/utils/claudeRuntimeInfo.js.map +1 -0
- package/dist/utils/claudeScrapeShapes.d.ts +256 -0
- package/dist/utils/claudeScrapeShapes.d.ts.map +1 -0
- package/dist/utils/claudeScrapeShapes.js +290 -0
- package/dist/utils/claudeScrapeShapes.js.map +1 -0
- package/dist/utils/claudeSessionTitle.d.ts +27 -0
- package/dist/utils/claudeSessionTitle.d.ts.map +1 -0
- package/dist/utils/claudeSessionTitle.js +90 -0
- package/dist/utils/claudeSessionTitle.js.map +1 -0
- package/dist/utils/claudeStreamJson.d.ts +202 -0
- package/dist/utils/claudeStreamJson.d.ts.map +1 -0
- package/dist/utils/claudeStreamJson.js +351 -0
- package/dist/utils/claudeStreamJson.js.map +1 -0
- package/dist/utils/claudeSubagentTail.d.ts +93 -0
- package/dist/utils/claudeSubagentTail.d.ts.map +1 -0
- package/dist/utils/claudeSubagentTail.js +136 -0
- package/dist/utils/claudeSubagentTail.js.map +1 -0
- package/dist/utils/clearThreadOutputQueues.d.ts +43 -0
- package/dist/utils/clearThreadOutputQueues.d.ts.map +1 -0
- package/dist/utils/clearThreadOutputQueues.js +39 -0
- package/dist/utils/clearThreadOutputQueues.js.map +1 -0
- package/dist/utils/compactCommandRoute.d.ts +45 -0
- package/dist/utils/compactCommandRoute.d.ts.map +1 -0
- package/dist/utils/compactCommandRoute.js +36 -0
- package/dist/utils/compactCommandRoute.js.map +1 -0
- package/dist/utils/compactOnIdle.d.ts +329 -0
- package/dist/utils/compactOnIdle.d.ts.map +1 -0
- package/dist/utils/compactOnIdle.js +379 -0
- package/dist/utils/compactOnIdle.js.map +1 -0
- package/dist/utils/consoleFileTap.d.ts +51 -0
- package/dist/utils/consoleFileTap.d.ts.map +1 -0
- package/dist/utils/consoleFileTap.js +86 -0
- package/dist/utils/consoleFileTap.js.map +1 -0
- package/dist/utils/displayVerbosity.d.ts +44 -0
- package/dist/utils/displayVerbosity.d.ts.map +1 -0
- package/dist/utils/displayVerbosity.js +75 -0
- package/dist/utils/displayVerbosity.js.map +1 -0
- package/dist/utils/download.d.ts +72 -0
- package/dist/utils/download.d.ts.map +1 -0
- package/dist/utils/download.js +216 -0
- package/dist/utils/download.js.map +1 -0
- package/dist/utils/draftFinalize.d.ts +110 -0
- package/dist/utils/draftFinalize.d.ts.map +1 -0
- package/dist/utils/draftFinalize.js +100 -0
- package/dist/utils/draftFinalize.js.map +1 -0
- package/dist/utils/draftId.d.ts +36 -0
- package/dist/utils/draftId.d.ts.map +1 -0
- package/dist/utils/draftId.js +46 -0
- package/dist/utils/draftId.js.map +1 -0
- package/dist/utils/draftPacer.d.ts +72 -0
- package/dist/utils/draftPacer.d.ts.map +1 -0
- package/dist/utils/draftPacer.js +53 -0
- package/dist/utils/draftPacer.js.map +1 -0
- package/dist/utils/effortStartupKeystroke.d.ts +20 -0
- package/dist/utils/effortStartupKeystroke.d.ts.map +1 -0
- package/dist/utils/effortStartupKeystroke.js +28 -0
- package/dist/utils/effortStartupKeystroke.js.map +1 -0
- package/dist/utils/ensureSessionPlan.d.ts +70 -0
- package/dist/utils/ensureSessionPlan.d.ts.map +1 -0
- package/dist/utils/ensureSessionPlan.js +54 -0
- package/dist/utils/ensureSessionPlan.js.map +1 -0
- package/dist/utils/fileSendPlan.d.ts +217 -0
- package/dist/utils/fileSendPlan.d.ts.map +1 -0
- package/dist/utils/fileSendPlan.js +291 -0
- package/dist/utils/fileSendPlan.js.map +1 -0
- package/dist/utils/fileSendService.d.ts +94 -0
- package/dist/utils/fileSendService.d.ts.map +1 -0
- package/dist/utils/fileSendService.js +387 -0
- package/dist/utils/fileSendService.js.map +1 -0
- package/dist/utils/groupFinalizePlan.d.ts +38 -0
- package/dist/utils/groupFinalizePlan.d.ts.map +1 -0
- package/dist/utils/groupFinalizePlan.js +35 -0
- package/dist/utils/groupFinalizePlan.js.map +1 -0
- package/dist/utils/identicalOutputGuard.d.ts +83 -0
- package/dist/utils/identicalOutputGuard.d.ts.map +1 -0
- package/dist/utils/identicalOutputGuard.js +99 -0
- package/dist/utils/identicalOutputGuard.js.map +1 -0
- package/dist/utils/isoTimestamp.d.ts +16 -0
- package/dist/utils/isoTimestamp.d.ts.map +1 -0
- package/dist/utils/isoTimestamp.js +34 -0
- package/dist/utils/isoTimestamp.js.map +1 -0
- package/dist/utils/jsonStreamBusyWatchdog.d.ts +130 -0
- package/dist/utils/jsonStreamBusyWatchdog.d.ts.map +1 -0
- package/dist/utils/jsonStreamBusyWatchdog.js +122 -0
- package/dist/utils/jsonStreamBusyWatchdog.js.map +1 -0
- package/dist/utils/jsonStreamHost.d.ts +227 -0
- package/dist/utils/jsonStreamHost.d.ts.map +1 -0
- package/dist/utils/jsonStreamHost.js +417 -0
- package/dist/utils/jsonStreamHost.js.map +1 -0
- package/dist/utils/keyedTransitionQueue.d.ts +18 -0
- package/dist/utils/keyedTransitionQueue.d.ts.map +1 -0
- package/dist/utils/keyedTransitionQueue.js +34 -0
- package/dist/utils/keyedTransitionQueue.js.map +1 -0
- package/dist/utils/limitEpisodeRecovery.d.ts +92 -0
- package/dist/utils/limitEpisodeRecovery.d.ts.map +1 -0
- package/dist/utils/limitEpisodeRecovery.js +133 -0
- package/dist/utils/limitEpisodeRecovery.js.map +1 -0
- package/dist/utils/limitHeldPromptQueue.d.ts +48 -0
- package/dist/utils/limitHeldPromptQueue.d.ts.map +1 -0
- package/dist/utils/limitHeldPromptQueue.js +59 -0
- package/dist/utils/limitHeldPromptQueue.js.map +1 -0
- package/dist/utils/limitHeldPrompts.d.ts +58 -0
- package/dist/utils/limitHeldPrompts.d.ts.map +1 -0
- package/dist/utils/limitHeldPrompts.js +65 -0
- package/dist/utils/limitHeldPrompts.js.map +1 -0
- package/dist/utils/linkPreviewSuppression.d.ts +18 -0
- package/dist/utils/linkPreviewSuppression.d.ts.map +1 -0
- package/dist/utils/linkPreviewSuppression.js +37 -0
- package/dist/utils/linkPreviewSuppression.js.map +1 -0
- package/dist/utils/localClock.d.ts +15 -0
- package/dist/utils/localClock.d.ts.map +1 -0
- package/dist/utils/localClock.js +29 -0
- package/dist/utils/localClock.js.map +1 -0
- package/dist/utils/markdownTableRender.d.ts +83 -0
- package/dist/utils/markdownTableRender.d.ts.map +1 -0
- package/dist/utils/markdownTableRender.js +298 -0
- package/dist/utils/markdownTableRender.js.map +1 -0
- package/dist/utils/mediaGroupCollector.d.ts +51 -0
- package/dist/utils/mediaGroupCollector.d.ts.map +1 -0
- package/dist/utils/mediaGroupCollector.js +90 -0
- package/dist/utils/mediaGroupCollector.js.map +1 -0
- package/dist/utils/messageSendService.d.ts +136 -0
- package/dist/utils/messageSendService.d.ts.map +1 -0
- package/dist/utils/messageSendService.js +165 -0
- package/dist/utils/messageSendService.js.map +1 -0
- package/dist/utils/minutesOverride.d.ts +7 -0
- package/dist/utils/minutesOverride.d.ts.map +1 -0
- package/dist/utils/minutesOverride.js +16 -0
- package/dist/utils/minutesOverride.js.map +1 -0
- package/dist/utils/modelPickerPlan.d.ts +119 -0
- package/dist/utils/modelPickerPlan.d.ts.map +1 -0
- package/dist/utils/modelPickerPlan.js +171 -0
- package/dist/utils/modelPickerPlan.js.map +1 -0
- package/dist/utils/modelSetReplyDecision.d.ts +67 -0
- package/dist/utils/modelSetReplyDecision.d.ts.map +1 -0
- package/dist/utils/modelSetReplyDecision.js +27 -0
- package/dist/utils/modelSetReplyDecision.js.map +1 -0
- package/dist/utils/openCodeAuthLogin.d.ts +181 -0
- package/dist/utils/openCodeAuthLogin.d.ts.map +1 -0
- package/dist/utils/openCodeAuthLogin.js +393 -0
- package/dist/utils/openCodeAuthLogin.js.map +1 -0
- package/dist/utils/openCodeCompactPlugin.d.ts +81 -0
- package/dist/utils/openCodeCompactPlugin.d.ts.map +1 -0
- package/dist/utils/openCodeCompactPlugin.js +146 -0
- package/dist/utils/openCodeCompactPlugin.js.map +1 -0
- package/dist/utils/openCodeTurnActivity.d.ts +67 -0
- package/dist/utils/openCodeTurnActivity.d.ts.map +1 -0
- package/dist/utils/openCodeTurnActivity.js +27 -0
- package/dist/utils/openCodeTurnActivity.js.map +1 -0
- package/dist/utils/outputDebounce.d.ts +24 -0
- package/dist/utils/outputDebounce.d.ts.map +1 -0
- package/dist/utils/outputDebounce.js +30 -0
- package/dist/utils/outputDebounce.js.map +1 -0
- package/dist/utils/outputFlushTiming.d.ts +54 -0
- package/dist/utils/outputFlushTiming.d.ts.map +1 -0
- package/dist/utils/outputFlushTiming.js +48 -0
- package/dist/utils/outputFlushTiming.js.map +1 -0
- package/dist/utils/paginateList.d.ts +25 -0
- package/dist/utils/paginateList.d.ts.map +1 -0
- package/dist/utils/paginateList.js +32 -0
- package/dist/utils/paginateList.js.map +1 -0
- package/dist/utils/paneDiff.d.ts +55 -0
- package/dist/utils/paneDiff.d.ts.map +1 -0
- package/dist/utils/paneDiff.js +88 -0
- package/dist/utils/paneDiff.js.map +1 -0
- package/dist/utils/paneResizeGuard.d.ts +69 -0
- package/dist/utils/paneResizeGuard.d.ts.map +1 -0
- package/dist/utils/paneResizeGuard.js +91 -0
- package/dist/utils/paneResizeGuard.js.map +1 -0
- package/dist/utils/persistAdapterSessionIds.d.ts +39 -0
- package/dist/utils/persistAdapterSessionIds.d.ts.map +1 -0
- package/dist/utils/persistAdapterSessionIds.js +28 -0
- package/dist/utils/persistAdapterSessionIds.js.map +1 -0
- package/dist/utils/pinnedBannerSkipDecision.d.ts +44 -0
- package/dist/utils/pinnedBannerSkipDecision.d.ts.map +1 -0
- package/dist/utils/pinnedBannerSkipDecision.js +20 -0
- package/dist/utils/pinnedBannerSkipDecision.js.map +1 -0
- package/dist/utils/pollBackoff.d.ts +45 -0
- package/dist/utils/pollBackoff.d.ts.map +1 -0
- package/dist/utils/pollBackoff.js +44 -0
- package/dist/utils/pollBackoff.js.map +1 -0
- package/dist/utils/promptDelivery.d.ts +46 -0
- package/dist/utils/promptDelivery.d.ts.map +1 -0
- package/dist/utils/promptDelivery.js +49 -0
- package/dist/utils/promptDelivery.js.map +1 -0
- package/dist/utils/providerDisconnectPlan.d.ts +82 -0
- package/dist/utils/providerDisconnectPlan.d.ts.map +1 -0
- package/dist/utils/providerDisconnectPlan.js +110 -0
- package/dist/utils/providerDisconnectPlan.js.map +1 -0
- package/dist/utils/rateLimitLog.d.ts +48 -0
- package/dist/utils/rateLimitLog.d.ts.map +1 -0
- package/dist/utils/rateLimitLog.js +43 -0
- package/dist/utils/rateLimitLog.js.map +1 -0
- package/dist/utils/recentRelayWindow.d.ts +165 -0
- package/dist/utils/recentRelayWindow.d.ts.map +1 -0
- package/dist/utils/recentRelayWindow.js +284 -0
- package/dist/utils/recentRelayWindow.js.map +1 -0
- package/dist/utils/recvPreviewRedaction.d.ts +23 -0
- package/dist/utils/recvPreviewRedaction.d.ts.map +1 -0
- package/dist/utils/recvPreviewRedaction.js +39 -0
- package/dist/utils/recvPreviewRedaction.js.map +1 -0
- package/dist/utils/reminderFlow.d.ts +148 -0
- package/dist/utils/reminderFlow.d.ts.map +1 -0
- package/dist/utils/reminderFlow.js +122 -0
- package/dist/utils/reminderFlow.js.map +1 -0
- package/dist/utils/reminderScheduleText.d.ts +87 -0
- package/dist/utils/reminderScheduleText.d.ts.map +1 -0
- package/dist/utils/reminderScheduleText.js +135 -0
- package/dist/utils/reminderScheduleText.js.map +1 -0
- package/dist/utils/reminderWizard.d.ts +710 -0
- package/dist/utils/reminderWizard.d.ts.map +1 -0
- package/dist/utils/reminderWizard.js +1164 -0
- package/dist/utils/reminderWizard.js.map +1 -0
- package/dist/utils/replyQuote.d.ts +111 -0
- package/dist/utils/replyQuote.d.ts.map +1 -0
- package/dist/utils/replyQuote.js +122 -0
- package/dist/utils/replyQuote.js.map +1 -0
- package/dist/utils/resolveBinary.d.ts +25 -0
- package/dist/utils/resolveBinary.d.ts.map +1 -0
- package/dist/utils/resolveBinary.js +99 -0
- package/dist/utils/resolveBinary.js.map +1 -0
- package/dist/utils/retryAfterHeader.d.ts +7 -0
- package/dist/utils/retryAfterHeader.d.ts.map +1 -0
- package/dist/utils/retryAfterHeader.js +17 -0
- package/dist/utils/retryAfterHeader.js.map +1 -0
- package/dist/utils/rotatingJsonlFile.d.ts +40 -0
- package/dist/utils/rotatingJsonlFile.d.ts.map +1 -0
- package/dist/utils/rotatingJsonlFile.js +106 -0
- package/dist/utils/rotatingJsonlFile.js.map +1 -0
- package/dist/utils/rotatingLogFile.d.ts +25 -0
- package/dist/utils/rotatingLogFile.d.ts.map +1 -0
- package/dist/utils/rotatingLogFile.js +74 -0
- package/dist/utils/rotatingLogFile.js.map +1 -0
- package/dist/utils/sendRateTracker.d.ts +59 -0
- package/dist/utils/sendRateTracker.d.ts.map +1 -0
- package/dist/utils/sendRateTracker.js +144 -0
- package/dist/utils/sendRateTracker.js.map +1 -0
- package/dist/utils/serialQueue.d.ts +5 -0
- package/dist/utils/serialQueue.d.ts.map +1 -0
- package/dist/utils/serialQueue.js +14 -0
- package/dist/utils/serialQueue.js.map +1 -0
- package/dist/utils/sseStreamLifecycle.d.ts +32 -0
- package/dist/utils/sseStreamLifecycle.d.ts.map +1 -0
- package/dist/utils/sseStreamLifecycle.js +41 -0
- package/dist/utils/sseStreamLifecycle.js.map +1 -0
- package/dist/utils/startupReadiness.d.ts +119 -0
- package/dist/utils/startupReadiness.d.ts.map +1 -0
- package/dist/utils/startupReadiness.js +148 -0
- package/dist/utils/startupReadiness.js.map +1 -0
- package/dist/utils/statusFlushDecision.d.ts +18 -0
- package/dist/utils/statusFlushDecision.d.ts.map +1 -0
- package/dist/utils/statusFlushDecision.js +53 -0
- package/dist/utils/statusFlushDecision.js.map +1 -0
- package/dist/utils/subagentRender.d.ts +52 -0
- package/dist/utils/subagentRender.d.ts.map +1 -0
- package/dist/utils/subagentRender.js +66 -0
- package/dist/utils/subagentRender.js.map +1 -0
- package/dist/utils/subagentStatusRender.d.ts +90 -0
- package/dist/utils/subagentStatusRender.d.ts.map +1 -0
- package/dist/utils/subagentStatusRender.js +124 -0
- package/dist/utils/subagentStatusRender.js.map +1 -0
- package/dist/utils/telegramError.d.ts +2 -0
- package/dist/utils/telegramError.d.ts.map +1 -0
- package/dist/utils/telegramError.js +16 -0
- package/dist/utils/telegramError.js.map +1 -0
- package/dist/utils/terminalEmitPlan.d.ts +74 -0
- package/dist/utils/terminalEmitPlan.d.ts.map +1 -0
- package/dist/utils/terminalEmitPlan.js +86 -0
- package/dist/utils/terminalEmitPlan.js.map +1 -0
- package/dist/utils/thinkingRender.d.ts +74 -0
- package/dist/utils/thinkingRender.d.ts.map +1 -0
- package/dist/utils/thinkingRender.js +85 -0
- package/dist/utils/thinkingRender.js.map +1 -0
- package/dist/utils/threadStatusReport.d.ts +55 -0
- package/dist/utils/threadStatusReport.d.ts.map +1 -0
- package/dist/utils/threadStatusReport.js +65 -0
- package/dist/utils/threadStatusReport.js.map +1 -0
- package/dist/utils/threadToggle.d.ts +29 -0
- package/dist/utils/threadToggle.d.ts.map +1 -0
- package/dist/utils/threadToggle.js +39 -0
- package/dist/utils/threadToggle.js.map +1 -0
- package/dist/utils/timezone.d.ts +125 -0
- package/dist/utils/timezone.d.ts.map +1 -0
- package/dist/utils/timezone.js +278 -0
- package/dist/utils/timezone.js.map +1 -0
- package/dist/utils/tmuxExec.d.ts +61 -0
- package/dist/utils/tmuxExec.d.ts.map +1 -0
- package/dist/utils/tmuxExec.js +109 -0
- package/dist/utils/tmuxExec.js.map +1 -0
- package/dist/utils/tmuxSessionName.d.ts +34 -0
- package/dist/utils/tmuxSessionName.d.ts.map +1 -0
- package/dist/utils/tmuxSessionName.js +51 -0
- package/dist/utils/tmuxSessionName.js.map +1 -0
- package/dist/utils/toolResultRender.d.ts +61 -0
- package/dist/utils/toolResultRender.d.ts.map +1 -0
- package/dist/utils/toolResultRender.js +62 -0
- package/dist/utils/toolResultRender.js.map +1 -0
- package/dist/utils/topicRequest.d.ts +61 -0
- package/dist/utils/topicRequest.d.ts.map +1 -0
- package/dist/utils/topicRequest.js +68 -0
- package/dist/utils/topicRequest.js.map +1 -0
- package/dist/utils/topicView.d.ts +55 -0
- package/dist/utils/topicView.d.ts.map +1 -0
- package/dist/utils/topicView.js +56 -0
- package/dist/utils/topicView.js.map +1 -0
- package/dist/utils/transcribeAudio.d.ts +89 -0
- package/dist/utils/transcribeAudio.d.ts.map +1 -0
- package/dist/utils/transcribeAudio.js +249 -0
- package/dist/utils/transcribeAudio.js.map +1 -0
- package/dist/utils/transientFrames.d.ts +52 -0
- package/dist/utils/transientFrames.d.ts.map +1 -0
- package/dist/utils/transientFrames.js +41 -0
- package/dist/utils/transientFrames.js.map +1 -0
- package/dist/utils/typingActive.d.ts +35 -0
- package/dist/utils/typingActive.d.ts.map +1 -0
- package/dist/utils/typingActive.js +22 -0
- package/dist/utils/typingActive.js.map +1 -0
- package/dist/utils/typingLoopBackstop.d.ts +64 -0
- package/dist/utils/typingLoopBackstop.d.ts.map +1 -0
- package/dist/utils/typingLoopBackstop.js +68 -0
- package/dist/utils/typingLoopBackstop.js.map +1 -0
- package/dist/utils/verbosityRender.d.ts +18 -0
- package/dist/utils/verbosityRender.d.ts.map +1 -0
- package/dist/utils/verbosityRender.js +17 -0
- package/dist/utils/verbosityRender.js.map +1 -0
- package/dist/utils/wedgeRecovery.d.ts +57 -0
- package/dist/utils/wedgeRecovery.d.ts.map +1 -0
- package/dist/utils/wedgeRecovery.js +24 -0
- package/dist/utils/wedgeRecovery.js.map +1 -0
- package/dist/utils.d.ts +30 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +61 -0
- package/dist/utils.js.map +1 -0
- package/dist/validation.d.ts +113 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +226 -0
- package/dist/validation.js.map +1 -0
- package/dist/voiceQueue.d.ts +7 -0
- package/dist/voiceQueue.d.ts.map +1 -0
- package/dist/voiceQueue.js +33 -0
- package/dist/voiceQueue.js.map +1 -0
- package/examples/.env.example +17 -0
- package/examples/docker-compose.yml +36 -0
- package/package.json +83 -4
|
@@ -0,0 +1,841 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getProviderAuthAdapter = getProviderAuthAdapter;
|
|
4
|
+
exports.buildModelProviderRender = buildModelProviderRender;
|
|
5
|
+
exports.buildModelPageRender = buildModelPageRender;
|
|
6
|
+
exports.createModelProviders = createModelProviders;
|
|
7
|
+
/**
|
|
8
|
+
* `/model`, `/effort`, `/connect` and `/disconnect` — the provider → models picker, the effort picker and the
|
|
9
|
+
* provider credential flows — with their buttons. See README.md in this folder.
|
|
10
|
+
*/
|
|
11
|
+
const telegraf_1 = require("telegraf");
|
|
12
|
+
const createAdapter_1 = require("../../../adapters/createAdapter");
|
|
13
|
+
const sessionKey_1 = require("../../../sessionKey");
|
|
14
|
+
const sessionKeyCodec_1 = require("../sessionKeyCodec");
|
|
15
|
+
const openCodeAdapter_1 = require("../../../adapters/openCodeAdapter");
|
|
16
|
+
const rateLimiter_1 = require("../../../rateLimiter");
|
|
17
|
+
const i18n_1 = require("../../../i18n");
|
|
18
|
+
const paginateList_1 = require("../../../utils/paginateList");
|
|
19
|
+
const modelPickerPlan_1 = require("../../../utils/modelPickerPlan");
|
|
20
|
+
const providerDisconnectPlan_1 = require("../../../utils/providerDisconnectPlan");
|
|
21
|
+
const sendErrorClassifier_1 = require("../../../sendErrorClassifier");
|
|
22
|
+
const modelSetReplyDecision_1 = require("../../../utils/modelSetReplyDecision");
|
|
23
|
+
const effortLevels_1 = require("../../../effortLevels");
|
|
24
|
+
const openCodeAuthLogin_1 = require("../../../utils/openCodeAuthLogin");
|
|
25
|
+
const callbackMessage_1 = require("./callbackMessage");
|
|
26
|
+
const defaultConnectProviderId = 'openai';
|
|
27
|
+
function checkLooksLikeProviderApiKey(value) {
|
|
28
|
+
return value.startsWith('sk-');
|
|
29
|
+
}
|
|
30
|
+
function getConnectCommandArgs(parsed) {
|
|
31
|
+
const args = parsed.args;
|
|
32
|
+
if (args.length === 0)
|
|
33
|
+
return { providerId: defaultConnectProviderId, apiKey: null };
|
|
34
|
+
if (args.length === 1) {
|
|
35
|
+
const onlyArg = args[0].trim();
|
|
36
|
+
if (checkLooksLikeProviderApiKey(onlyArg)) {
|
|
37
|
+
return { providerId: defaultConnectProviderId, apiKey: onlyArg };
|
|
38
|
+
}
|
|
39
|
+
return { providerId: onlyArg.toLowerCase(), apiKey: null };
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
providerId: args[0].trim().toLowerCase(),
|
|
43
|
+
apiKey: args.slice(1).join(' ').trim(),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* @description The adapter that owns provider credentials.
|
|
48
|
+
*
|
|
49
|
+
* Provider auth is an OpenCode concept, so `/connect` and `/disconnect` BOTH
|
|
50
|
+
* target the OpenCode adapter directly instead of the thread's current
|
|
51
|
+
* backend — otherwise a topic that never started OpenCode could connect a
|
|
52
|
+
* provider (which `/connect` has always allowed) but not disconnect it, and
|
|
53
|
+
* the two are advertised side by side in the bound-thread help.
|
|
54
|
+
*/
|
|
55
|
+
function getProviderAuthAdapter() {
|
|
56
|
+
return (0, createAdapter_1.getAdapter)('opencode');
|
|
57
|
+
}
|
|
58
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
59
|
+
// /model — two-level provider → models picker
|
|
60
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
61
|
+
/**
|
|
62
|
+
* @description Models per page in the `/model` model level. Model names are
|
|
63
|
+
* long, so each gets a full-width row; 10 rows keep the keyboard scroll-free
|
|
64
|
+
* and the numbered text list ~10 short lines — far from Telegram's 4096-char
|
|
65
|
+
* message cap, which the old render-everything list blew past (12 990 chars on
|
|
66
|
+
* a 367-model `openrouter` catalog → every `/model` died with "message is too
|
|
67
|
+
* long" and the topic went silent).
|
|
68
|
+
*/
|
|
69
|
+
const MODEL_PAGE_SIZE = 10;
|
|
70
|
+
/** Model label the thread currently runs, or the localized "default" stand-in. */
|
|
71
|
+
function getCurrentModelLabel(adapter, key) {
|
|
72
|
+
return adapter.getCurrentModel?.(key) || (0, i18n_1.t)('model.current_default');
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* @description Provider level: one row per provider, each with a 🙈 button that
|
|
76
|
+
* hides it from the picker. Hidden providers follow in their own section with a
|
|
77
|
+
* 👁 button to bring them back — the only way back, so they must always render.
|
|
78
|
+
*/
|
|
79
|
+
function buildModelProviderKeyboard(catalog) {
|
|
80
|
+
const hiddenProviderSet = new Set(catalog.hiddenProviders);
|
|
81
|
+
const visibleRows = [];
|
|
82
|
+
const hiddenRows = [];
|
|
83
|
+
catalog.providers.forEach((provider, providerIndex) => {
|
|
84
|
+
const count = catalog.byProvider.get(provider)?.length ?? 0;
|
|
85
|
+
if (hiddenProviderSet.has(provider)) {
|
|
86
|
+
hiddenRows.push([
|
|
87
|
+
telegraf_1.Markup.button.callback((0, i18n_1.t)('model.hidden_provider_button', { provider, count }), modelPickerPlan_1.modelPickerNoopCallback),
|
|
88
|
+
telegraf_1.Markup.button.callback((0, i18n_1.t)('model.show_button'), (0, modelPickerPlan_1.buildProviderShowCallback)(providerIndex)),
|
|
89
|
+
]);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
visibleRows.push([
|
|
93
|
+
telegraf_1.Markup.button.callback((0, i18n_1.t)('model.provider_button', { provider, count }), (0, modelPickerPlan_1.buildProviderPageCallback)(providerIndex, 0)),
|
|
94
|
+
telegraf_1.Markup.button.callback((0, i18n_1.t)('model.hide_button'), (0, modelPickerPlan_1.buildProviderHideCallback)(providerIndex)),
|
|
95
|
+
]);
|
|
96
|
+
});
|
|
97
|
+
return telegraf_1.Markup.inlineKeyboard([...visibleRows, ...hiddenRows]);
|
|
98
|
+
}
|
|
99
|
+
function buildModelProviderText(catalog, current) {
|
|
100
|
+
// An EMPTY catalog is not "everything is hidden": there is no 👁 row to tap,
|
|
101
|
+
// so that copy would be a dead end. Reachable on the in-place re-render path
|
|
102
|
+
// (hide/show/«back») when the backend's model lookup comes back empty — e.g.
|
|
103
|
+
// a `/disconnect` dropped the last provider, or the CLI lookup failed right
|
|
104
|
+
// after `resetOpenCodeProviderCaches()` wiped the cache.
|
|
105
|
+
if (catalog.providers.length === 0)
|
|
106
|
+
return (0, i18n_1.t)('model.none_available', { current });
|
|
107
|
+
if (catalog.visibleProviders.length === 0)
|
|
108
|
+
return (0, i18n_1.t)('model.all_hidden', { current });
|
|
109
|
+
const header = (0, i18n_1.t)('model.pick_provider', { current });
|
|
110
|
+
return catalog.hiddenProviders.length > 0 ? `${header}\n\n${(0, i18n_1.t)('model.hidden_header')}` : header;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* @description Provider level (level 1) as a ready-to-send render. Exported so
|
|
114
|
+
* the "no render path can outgrow Telegram's message cap" guarantee — the whole
|
|
115
|
+
* point of the two-level picker — is assertable on THIS level too, not just on
|
|
116
|
+
* the paginated model level.
|
|
117
|
+
*/
|
|
118
|
+
function buildModelProviderRender(catalog, current) {
|
|
119
|
+
return {
|
|
120
|
+
text: buildModelProviderText(catalog, current),
|
|
121
|
+
keyboard: buildModelProviderKeyboard(catalog),
|
|
122
|
+
pageModels: [],
|
|
123
|
+
isNumberedPickArmed: false,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* @description Model level: one page of a single provider's models.
|
|
128
|
+
*
|
|
129
|
+
* Returns `null` when the provider index no longer resolves (a stale keyboard
|
|
130
|
+
* after the catalog changed) or points at a HIDDEN provider — hiding must make
|
|
131
|
+
* a provider unreachable here, not just invisible one level up.
|
|
132
|
+
*/
|
|
133
|
+
function buildModelPageRender(catalog, providerIndex, page, current, options) {
|
|
134
|
+
const provider = catalog.providers[providerIndex];
|
|
135
|
+
if (provider === undefined || catalog.hiddenProviders.includes(provider))
|
|
136
|
+
return null;
|
|
137
|
+
const providerModels = catalog.byProvider.get(provider) ?? [];
|
|
138
|
+
const { slice, currentPage, totalPages } = (0, paginateList_1.paginateList)(providerModels, page, MODEL_PAGE_SIZE);
|
|
139
|
+
const firstIndexOnPage = currentPage * MODEL_PAGE_SIZE;
|
|
140
|
+
const rows = slice.map((modelId, offset) => {
|
|
141
|
+
const shortLabel = (0, modelPickerPlan_1.getModelShortLabel)(modelId, provider);
|
|
142
|
+
return [
|
|
143
|
+
telegraf_1.Markup.button.callback(modelId === current ? `${shortLabel} ✓` : shortLabel, (0, modelPickerPlan_1.buildModelPickCallback)(providerIndex, firstIndexOnPage + offset)),
|
|
144
|
+
];
|
|
145
|
+
});
|
|
146
|
+
if (totalPages > 1) {
|
|
147
|
+
const nav = [];
|
|
148
|
+
if (currentPage > 0) {
|
|
149
|
+
nav.push(telegraf_1.Markup.button.callback((0, i18n_1.t)('model.prev_button'), (0, modelPickerPlan_1.buildProviderPageCallback)(providerIndex, currentPage - 1)));
|
|
150
|
+
}
|
|
151
|
+
nav.push(telegraf_1.Markup.button.callback((0, i18n_1.t)('model.page_button', { page: currentPage + 1, totalPages }), modelPickerPlan_1.modelPickerNoopCallback));
|
|
152
|
+
if (currentPage < totalPages - 1) {
|
|
153
|
+
nav.push(telegraf_1.Markup.button.callback((0, i18n_1.t)('model.next_button'), (0, modelPickerPlan_1.buildProviderPageCallback)(providerIndex, currentPage + 1)));
|
|
154
|
+
}
|
|
155
|
+
rows.push(nav);
|
|
156
|
+
}
|
|
157
|
+
// No back row when the provider level was skipped — it would lead nowhere.
|
|
158
|
+
if ((0, modelPickerPlan_1.checkHasProviderLevel)(catalog.visibleProviders.length, catalog.hiddenProviders.length)) {
|
|
159
|
+
rows.push([telegraf_1.Markup.button.callback((0, i18n_1.t)('model.back_button'), modelPickerPlan_1.modelPickerBackCallback)]);
|
|
160
|
+
}
|
|
161
|
+
const header = (0, i18n_1.t)('model.page_header', {
|
|
162
|
+
provider,
|
|
163
|
+
count: providerModels.length,
|
|
164
|
+
page: currentPage + 1,
|
|
165
|
+
totalPages,
|
|
166
|
+
current,
|
|
167
|
+
});
|
|
168
|
+
const numberedList = options.isWithNumberedList
|
|
169
|
+
? slice.map((modelId, offset) => `${offset + 1}. ${(0, modelPickerPlan_1.getModelShortLabel)(modelId, provider)}`).join('\n')
|
|
170
|
+
: '';
|
|
171
|
+
const hint = options.isWithNumberedList ? (0, i18n_1.t)('model.page_hint') : (0, i18n_1.t)('model.page_hint_buttons_only');
|
|
172
|
+
const text = [header, numberedList, hint].filter((part) => part.length > 0).join('\n\n');
|
|
173
|
+
return {
|
|
174
|
+
text,
|
|
175
|
+
keyboard: telegraf_1.Markup.inlineKeyboard(rows),
|
|
176
|
+
pageModels: slice,
|
|
177
|
+
isNumberedPickArmed: options.isWithNumberedList,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* @description Swap a picker message to another level/page in place, keeping
|
|
182
|
+
* the thread clean. A no-op edit (same button tapped twice) comes back as
|
|
183
|
+
* Telegram's "message is not modified" 400, which is swallowed.
|
|
184
|
+
*/
|
|
185
|
+
async function editModelPickerMessage(ctx, render) {
|
|
186
|
+
try {
|
|
187
|
+
await ctx.editMessageText(render.text, render.keyboard);
|
|
188
|
+
}
|
|
189
|
+
catch (e) {
|
|
190
|
+
const desc = (0, sendErrorClassifier_1.checkIsApiError)(e) ? (0, sendErrorClassifier_1.getErrorDescription)(e) : '';
|
|
191
|
+
if (!/message is not modified/i.test(desc)) {
|
|
192
|
+
console.warn('[model picker] edit failed:', desc || e);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* @description Build the `/effort` level picker keyboard.
|
|
198
|
+
*
|
|
199
|
+
* One callback button per available reasoning-effort level (3 per row);
|
|
200
|
+
* the level matching `current` carries a `✓` marker. Shared by the
|
|
201
|
+
* `/effort` command (initial render) and the `effort_<level>` callback
|
|
202
|
+
* (re-render after a press) so the marker can never drift between the two.
|
|
203
|
+
*/
|
|
204
|
+
function buildEffortKeyboard(levels, current) {
|
|
205
|
+
const buttons = levels.map((l) => telegraf_1.Markup.button.callback(l === current ? `${l} ✓` : l, `effort_${l}`));
|
|
206
|
+
return telegraf_1.Markup.inlineKeyboard(buttons, { columns: 3 });
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* @description Build the model, effort and provider-credential flows over their ports. It returns what the bot's
|
|
210
|
+
* text handler reaches into (a pasted provider key, a numbered model pick) and the `register…()` calls, which the
|
|
211
|
+
* bot makes at the positions its neighbouring commands and buttons are registered.
|
|
212
|
+
*/
|
|
213
|
+
function createModelProviders(ports) {
|
|
214
|
+
const { awaitingModelSelection, awaitingSessionSelection, awaitingFolderName, threadModelLists, pendingProviderConnects, connectMethodLists, disconnectProviderLists, startOpenCodeOAuthLogin, bot, command, getState, replyToThread, deleteThreadMessage, authoriseContext, updatePinnedStatus, wakeSleepingSession } = ports;
|
|
215
|
+
/**
|
|
216
|
+
* @description Single choke point for the four `/model`-set paths (the
|
|
217
|
+
* `/model <num>` and `/model <name>` commands, the text-handler numeric pick,
|
|
218
|
+
* and the `model_<id>` button callback). Drives the thread's adapter and turns
|
|
219
|
+
* the outcome into a ready reply via the pure {@link getModelSetReplyDecision}.
|
|
220
|
+
*
|
|
221
|
+
* No session gate here: each adapter decides what "no session" means
|
|
222
|
+
* (OpenCode persists the pick for the next start and succeeds; Claude refuses
|
|
223
|
+
* with a notice). On success the pinned banner is refreshed best-effort.
|
|
224
|
+
*/
|
|
225
|
+
async function applyModelSelection(adapter, key, modelId) {
|
|
226
|
+
// A sleeping conversation is woken first (L-D4), so the pick applies to its live session
|
|
227
|
+
// instead of the "start the agent first" refusal of an idle backend.
|
|
228
|
+
const wakeNotice = await wakeSleepingSession(key);
|
|
229
|
+
if (wakeNotice)
|
|
230
|
+
await replyToThread(key, wakeNotice);
|
|
231
|
+
const setModelError = adapter.setModel ? await adapter.setModel(key, modelId) : null;
|
|
232
|
+
const displayLabel = adapter.getCurrentModel?.(key) || modelId;
|
|
233
|
+
// Read AFTER the switch: a model that does not offer the level in force
|
|
234
|
+
// clears it (`effort.cleared_on_model_switch`), so a pre-switch read would
|
|
235
|
+
// report a level the new model no longer runs. Same resolution rule as
|
|
236
|
+
// `/status` — no `getEffort` means the backend has no effort concept at all.
|
|
237
|
+
const effort = adapter.getEffort ? (adapter.getEffort(key) ?? effortLevels_1.defaultEffortLevel) : null;
|
|
238
|
+
const decision = (0, modelSetReplyDecision_1.getModelSetReplyDecision)({
|
|
239
|
+
hasSetModel: Boolean(adapter.setModel),
|
|
240
|
+
setModelError,
|
|
241
|
+
isActive: adapter.checkIsActive(key),
|
|
242
|
+
adapterLabel: adapter.label,
|
|
243
|
+
displayLabel,
|
|
244
|
+
effort,
|
|
245
|
+
}, i18n_1.t);
|
|
246
|
+
if (decision.isOk)
|
|
247
|
+
await updatePinnedStatus(key).catch(() => { });
|
|
248
|
+
return { ...decision, setModelError, displayLabel };
|
|
249
|
+
}
|
|
250
|
+
function armProviderConnect(key, providerId) {
|
|
251
|
+
const keyString = (0, sessionKey_1.keyToString)(key);
|
|
252
|
+
awaitingModelSelection.delete(keyString);
|
|
253
|
+
awaitingSessionSelection.delete(keyString);
|
|
254
|
+
awaitingFolderName.delete(keyString);
|
|
255
|
+
pendingProviderConnects.set(keyString, { providerId });
|
|
256
|
+
}
|
|
257
|
+
async function handleProviderConnectKey(key, providerId, apiKey, secretMessageId) {
|
|
258
|
+
const trimmedApiKey = apiKey.trim();
|
|
259
|
+
if (!trimmedApiKey) {
|
|
260
|
+
armProviderConnect(key, providerId);
|
|
261
|
+
await replyToThread(key, (0, i18n_1.t)('connect.empty_key'));
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
// Reject a value that can't be a real key (spaces / non-Latin-1 / controls)
|
|
265
|
+
// BEFORE storing it — otherwise a stray chat message captured by a stale
|
|
266
|
+
// `/connect` state becomes a broken `Authorization` header that only fails
|
|
267
|
+
// (cryptically) on the next request. An implausible value is NOT a secret, so
|
|
268
|
+
// keep it visible, re-arm, and hint. (live 2026-07-20)
|
|
269
|
+
if (!(0, openCodeAuthLogin_1.checkIsPlausibleProviderApiKey)(trimmedApiKey)) {
|
|
270
|
+
armProviderConnect(key, providerId);
|
|
271
|
+
await replyToThread(key, (0, i18n_1.t)('connect.invalid_key'));
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
// A plausible key IS a single-use secret → delete it from history now.
|
|
275
|
+
if (secretMessageId !== null) {
|
|
276
|
+
await deleteThreadMessage(key, secretMessageId);
|
|
277
|
+
}
|
|
278
|
+
const adapter = (0, createAdapter_1.getAdapter)('opencode');
|
|
279
|
+
if (!adapter.connectProvider) {
|
|
280
|
+
await replyToThread(key, (0, i18n_1.t)('connect.unsupported_backend'));
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
const connectError = await adapter.connectProvider(key, providerId, trimmedApiKey);
|
|
284
|
+
if (connectError) {
|
|
285
|
+
await replyToThread(key, connectError);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
await replyToThread(key, (0, i18n_1.t)('connect.success', { provider: providerId }));
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* @description Show the `/connect <provider>` method picker: one inline button
|
|
292
|
+
* per auth method from the live catalog — OAuth (subscription/account, driven
|
|
293
|
+
* out-of-band via `opencode auth login` in a pty) and the API-key method (the
|
|
294
|
+
* existing key-paste flow). Tapping a button fires the `connm_<idx>` callback.
|
|
295
|
+
*/
|
|
296
|
+
async function showConnectMethodPicker(key, providerId) {
|
|
297
|
+
const adapter = (0, createAdapter_1.getAdapter)('opencode');
|
|
298
|
+
if (!adapter.fetchProviderAuthMethods) {
|
|
299
|
+
await replyToThread(key, (0, i18n_1.t)('connect.unsupported_backend'));
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
let methods;
|
|
303
|
+
try {
|
|
304
|
+
methods = await adapter.fetchProviderAuthMethods(providerId);
|
|
305
|
+
}
|
|
306
|
+
catch (e) {
|
|
307
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
308
|
+
await replyToThread(key, (0, i18n_1.t)('connect.failed', { provider: providerId, reason }));
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
if (methods.length === 0) {
|
|
312
|
+
await replyToThread(key, (0, i18n_1.t)('connect.no_methods', { provider: providerId }));
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
connectMethodLists.set((0, sessionKey_1.keyToString)(key), { providerId, methods });
|
|
316
|
+
const buttons = methods.map((m, i) => telegraf_1.Markup.button.callback((0, openCodeAuthLogin_1.buildConnectMethodButtonLabel)(m), `connm_${i}`));
|
|
317
|
+
await replyToThread(key, (0, i18n_1.t)('connect.pick_method', { provider: providerId }), telegraf_1.Markup.inlineKeyboard(buttons, { columns: 1 }));
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* @description Apply a `/disconnect` for one provider and report the outcome.
|
|
321
|
+
*
|
|
322
|
+
* The adapter's `null` means a clean disconnect; a non-null string is the
|
|
323
|
+
* notice to show verbatim — a failure, OR the honest caveat that the provider
|
|
324
|
+
* is still active because the backend enables it from an environment variable
|
|
325
|
+
* (the `openrouter` / `OPENROUTER_API_KEY` case that `DELETE /auth/:id` cannot
|
|
326
|
+
* touch, and the reason `/model` also has a bot-side hide toggle).
|
|
327
|
+
*/
|
|
328
|
+
async function applyProviderDisconnect(key, providerId) {
|
|
329
|
+
const adapter = getProviderAuthAdapter();
|
|
330
|
+
if (!adapter.disconnectProvider) {
|
|
331
|
+
await replyToThread(key, (0, i18n_1.t)('disconnect.unsupported_backend'));
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
const notice = await adapter.disconnectProvider(key, providerId);
|
|
335
|
+
await replyToThread(key, notice ?? (0, i18n_1.t)('disconnect.success', { provider: providerId }));
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* @description Bare `/disconnect` → one button per currently active provider.
|
|
339
|
+
* The provider list comes from OpenCode's live model catalog (a provider
|
|
340
|
+
* serving no models is not connected in any useful sense) and INCLUDES hidden
|
|
341
|
+
* ones — hiding is a picker preference, orthogonal to dropping credentials.
|
|
342
|
+
*
|
|
343
|
+
* The snapshot is stored under the SENT MESSAGE's id, so this keyboard can only
|
|
344
|
+
* ever resolve against the list it actually shows.
|
|
345
|
+
*/
|
|
346
|
+
async function showDisconnectProviderPicker(key) {
|
|
347
|
+
const adapter = getProviderAuthAdapter();
|
|
348
|
+
if (!adapter.disconnectProvider) {
|
|
349
|
+
await replyToThread(key, (0, i18n_1.t)('disconnect.unsupported_backend'));
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
const catalog = await getModelCatalog(adapter);
|
|
353
|
+
if (catalog.providers.length === 0) {
|
|
354
|
+
await replyToThread(key, (0, i18n_1.t)('disconnect.no_providers'));
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
const buttons = catalog.providers.map((provider, index) => telegraf_1.Markup.button.callback((0, i18n_1.t)('disconnect.provider_button', { provider }), (0, providerDisconnectPlan_1.buildDisconnectProviderCallback)(index)));
|
|
358
|
+
const messageId = await replyToThread(key, (0, i18n_1.t)('disconnect.pick_provider'), telegraf_1.Markup.inlineKeyboard(buttons, { columns: 1 }));
|
|
359
|
+
// A failed send has no keyboard to resolve against — recording the snapshot
|
|
360
|
+
// would only leak an entry.
|
|
361
|
+
if (messageId === null)
|
|
362
|
+
return;
|
|
363
|
+
disconnectProviderLists.set((0, providerDisconnectPlan_1.buildDisconnectPickerKey)((0, sessionKey_1.keyToString)(key), messageId), catalog.providers);
|
|
364
|
+
for (const evictedKey of (0, providerDisconnectPlan_1.getEvictedDisconnectPickerKeys)(disconnectProviderLists.keys())) {
|
|
365
|
+
disconnectProviderLists.delete(evictedKey);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* @description Read the thread backend's model list and split it for the
|
|
370
|
+
* picker. Re-derived on every render (command AND callback) rather than
|
|
371
|
+
* snapshotted per thread — the same self-healing approach `bind_page` takes,
|
|
372
|
+
* and both adapters cache the underlying lookup.
|
|
373
|
+
*
|
|
374
|
+
* A backend without `getAvailableModels` (or a failing one) yields an empty
|
|
375
|
+
* catalog, which the caller turns into the "set it manually" notice.
|
|
376
|
+
*/
|
|
377
|
+
async function getModelCatalog(adapter) {
|
|
378
|
+
let models = [];
|
|
379
|
+
if (adapter.getAvailableModels) {
|
|
380
|
+
try {
|
|
381
|
+
models = await adapter.getAvailableModels();
|
|
382
|
+
}
|
|
383
|
+
catch (e) {
|
|
384
|
+
console.error('[Bot] getAvailableModels:', e);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
// Claude reports slash-less aliases (`sonnet`, `opus`, …) — they group under
|
|
388
|
+
// the adapter label, otherwise the picker would render an empty list.
|
|
389
|
+
return (0, modelPickerPlan_1.buildModelCatalog)(models, adapter.label, getState().getHiddenModelProviders());
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* @description Arm the numbered-reply affordance for the page just rendered.
|
|
393
|
+
* Scoped to the CURRENT PAGE: `threadModelLists` holds that page's ids in
|
|
394
|
+
* button order, so a bare digit picks what the user is looking at.
|
|
395
|
+
*/
|
|
396
|
+
function armModelPagePick(key, pageModels) {
|
|
397
|
+
const kStr = (0, sessionKey_1.keyToString)(key);
|
|
398
|
+
threadModelLists.set(kStr, pageModels);
|
|
399
|
+
awaitingModelSelection.add(kStr);
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* @description Whether a bare digit in this thread is currently read as a
|
|
403
|
+
* `/model` page pick. Read-only probe, exported so the "a BUTTON pick must
|
|
404
|
+
* disarm the numbered affordance" rule is directly assertable in tests — an
|
|
405
|
+
* armed thread silently swallows a later ordinary "3" prompt.
|
|
406
|
+
*/
|
|
407
|
+
function checkIsNumberedModelPickArmed(key) {
|
|
408
|
+
return awaitingModelSelection.has((0, sessionKey_1.keyToString)(key));
|
|
409
|
+
}
|
|
410
|
+
/** Disarm the numbered-reply affordance — the provider level shows no numbers. */
|
|
411
|
+
function clearModelPagePick(key) {
|
|
412
|
+
const kStr = (0, sessionKey_1.keyToString)(key);
|
|
413
|
+
threadModelLists.delete(kStr);
|
|
414
|
+
awaitingModelSelection.delete(kStr);
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* @description Resolve a numbered pick against the page the thread is currently
|
|
418
|
+
* looking at, and CONSUME the bare-digit affordance. `null` when the number
|
|
419
|
+
* addresses nothing on that page.
|
|
420
|
+
*
|
|
421
|
+
* The single resolver behind BOTH numbered entry points — `/model <n>` and the
|
|
422
|
+
* plain "3" reply — so the range check and the disarm cannot drift apart. The
|
|
423
|
+
* disarm is unconditional because an armed thread silently swallows a later
|
|
424
|
+
* ordinary "3" prompt as a model pick instead of forwarding it to the agent;
|
|
425
|
+
* `/model <n>` used to skip it entirely. The page list itself survives, so a
|
|
426
|
+
* follow-up `/model 4` still resolves against the list still on screen.
|
|
427
|
+
*
|
|
428
|
+
* Exported so that rule is directly assertable without a Telegram surface.
|
|
429
|
+
*/
|
|
430
|
+
function getNumberedModelPick(key, num) {
|
|
431
|
+
const kStr = (0, sessionKey_1.keyToString)(key);
|
|
432
|
+
const pageModels = threadModelLists.get(kStr);
|
|
433
|
+
awaitingModelSelection.delete(kStr);
|
|
434
|
+
if (!pageModels || num < 1 || num > pageModels.length)
|
|
435
|
+
return null;
|
|
436
|
+
return pageModels[num - 1];
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* @description Apply a numbered pick and reply — the shared tail of `/model <n>`
|
|
440
|
+
* and the plain "3" reply. Always replies (even for an adapter that cannot set a
|
|
441
|
+
* model), so both call sites can return unconditionally afterwards.
|
|
442
|
+
*/
|
|
443
|
+
async function applyNumberedModelPick(adapter, key, num) {
|
|
444
|
+
const selected = getNumberedModelPick(key, num);
|
|
445
|
+
if (selected === null) {
|
|
446
|
+
await replyToThread(key, (0, i18n_1.t)('model.invalid_number'));
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
const { message } = await applyModelSelection(adapter, key, selected);
|
|
450
|
+
await replyToThread(key, message);
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* @description Arm (or disarm) the bare-digit pick to match what the render
|
|
454
|
+
* actually shows. THE single choke point: a button pick re-renders its page
|
|
455
|
+
* WITHOUT numbers, and leaving `awaitingModelSelection` armed there made a
|
|
456
|
+
* later ordinary "3" prompt get swallowed as a model pick instead of reaching
|
|
457
|
+
* the agent.
|
|
458
|
+
*/
|
|
459
|
+
function applyModelPagePickArming(key, render) {
|
|
460
|
+
if (render.isNumberedPickArmed && render.pageModels.length > 0) {
|
|
461
|
+
armModelPagePick(key, render.pageModels);
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
clearModelPagePick(key);
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* @description Open the `/model` picker as a NEW message. Starts at the model
|
|
468
|
+
* level when the catalog has a single offered provider (the Claude aliases),
|
|
469
|
+
* otherwise at the provider level.
|
|
470
|
+
*/
|
|
471
|
+
async function showModelPicker(key, adapter) {
|
|
472
|
+
const current = getCurrentModelLabel(adapter, key);
|
|
473
|
+
const catalog = await getModelCatalog(adapter);
|
|
474
|
+
if (catalog.providers.length === 0) {
|
|
475
|
+
clearModelPagePick(key);
|
|
476
|
+
await replyToThread(key, (0, i18n_1.t)('model.none_available', { current }));
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
const render = (0, modelPickerPlan_1.checkHasProviderLevel)(catalog.visibleProviders.length, catalog.hiddenProviders.length)
|
|
480
|
+
? buildModelProviderRender(catalog, current)
|
|
481
|
+
// Single offered provider → the provider level is a one-button detour;
|
|
482
|
+
// `providers` then holds exactly that one entry, hence index 0.
|
|
483
|
+
: buildModelPageRender(catalog, 0, 0, current, { isWithNumberedList: true });
|
|
484
|
+
if (!render) {
|
|
485
|
+
clearModelPagePick(key);
|
|
486
|
+
await replyToThread(key, (0, i18n_1.t)('model.none_available', { current }));
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
applyModelPagePickArming(key, render);
|
|
490
|
+
await replyToThread(key, render.text, render.keyboard);
|
|
491
|
+
}
|
|
492
|
+
/** Re-render the provider level in place (after a hide/show toggle or «back»). */
|
|
493
|
+
async function refreshModelProviderLevel(ctx, key) {
|
|
494
|
+
const adapter = (0, createAdapter_1.getThreadAdapter)(key);
|
|
495
|
+
const catalog = await getModelCatalog(adapter);
|
|
496
|
+
const render = buildModelProviderRender(catalog, getCurrentModelLabel(adapter, key));
|
|
497
|
+
applyModelPagePickArming(key, render);
|
|
498
|
+
await editModelPickerMessage(ctx, render);
|
|
499
|
+
}
|
|
500
|
+
function registerProviderCommands() {
|
|
501
|
+
command('connect', async (ctx, key, parsed) => {
|
|
502
|
+
const { providerId, apiKey } = getConnectCommandArgs(parsed);
|
|
503
|
+
if (!(0, openCodeAdapter_1.checkIsValidProviderId)(providerId)) {
|
|
504
|
+
if (apiKey !== null)
|
|
505
|
+
await deleteThreadMessage(key, ctx.message.message_id);
|
|
506
|
+
await replyToThread(key, (0, i18n_1.t)('connect.invalid_provider', { provider: providerId }));
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
// Inline API-key fast path: `/connect <provider> sk-…` connects with the key
|
|
510
|
+
// directly (and deletes the secret message). No key → show the method picker
|
|
511
|
+
// so the user can choose OAuth (subscription) vs API key.
|
|
512
|
+
if (apiKey !== null) {
|
|
513
|
+
await handleProviderConnectKey(key, providerId, apiKey, ctx.message.message_id);
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
await showConnectMethodPicker(key, providerId);
|
|
517
|
+
});
|
|
518
|
+
command('disconnect', async (_ctx, key, parsed) => {
|
|
519
|
+
// No thread-adapter gate — `/connect` has none either; the unsupported-build
|
|
520
|
+
// guard lives where the provider-auth adapter is resolved.
|
|
521
|
+
const providerId = parsed.argsText;
|
|
522
|
+
if (!providerId) {
|
|
523
|
+
await showDisconnectProviderPicker(key);
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
526
|
+
await applyProviderDisconnect(key, providerId);
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
function registerModelCommands() {
|
|
530
|
+
command('model', async (_ctx, key, parsed) => {
|
|
531
|
+
const adapter = (0, createAdapter_1.getThreadAdapter)(key);
|
|
532
|
+
const args = parsed.argsText;
|
|
533
|
+
// numeric selection from the last rendered page
|
|
534
|
+
if (/^\d+$/.test(args)) {
|
|
535
|
+
await applyNumberedModelPick(adapter, key, parseInt(args, 10));
|
|
536
|
+
return;
|
|
537
|
+
}
|
|
538
|
+
// direct «/model provider/name» — resolves a HIDDEN provider too: hiding
|
|
539
|
+
// filters the picker only and must never break an explicit pick or a saved
|
|
540
|
+
// model pref.
|
|
541
|
+
if (args) {
|
|
542
|
+
const { message } = await applyModelSelection(adapter, key, args);
|
|
543
|
+
await replyToThread(key, message);
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
await showModelPicker(key, adapter);
|
|
547
|
+
});
|
|
548
|
+
command('effort', async (_ctx, key, parsed) => {
|
|
549
|
+
const adapter = (0, createAdapter_1.getThreadAdapter)(key);
|
|
550
|
+
const args = parsed.argsText;
|
|
551
|
+
// Backend must support the effort contract (both methods are optional).
|
|
552
|
+
if (!adapter.setEffort || !adapter.getAvailableEffortLevels) {
|
|
553
|
+
await replyToThread(key, (0, i18n_1.t)('effort.unsupported_backend', { label: adapter.label }));
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
556
|
+
// No `checkIsActive` gate — like `/model`, effort works pre-session: the
|
|
557
|
+
// adapter persists the pick (OpenCode/Claude) and a later session replays it.
|
|
558
|
+
// The picker lists the PROSPECTIVE model's levels; the direct-set path
|
|
559
|
+
// surfaces the adapter's own notice (e.g. Claude's `effort.start_agent_first`).
|
|
560
|
+
// Direct set: `/effort <level>`. The adapter validates (Claude against its
|
|
561
|
+
// canonical set, OpenCode against the model's variants) and returns a
|
|
562
|
+
// user-facing notice string on any non-success.
|
|
563
|
+
if (args) {
|
|
564
|
+
const wakeNotice = await wakeSleepingSession(key); // L-D4: apply to the woken session
|
|
565
|
+
if (wakeNotice)
|
|
566
|
+
await replyToThread(key, wakeNotice);
|
|
567
|
+
const err = await adapter.setEffort(key, args);
|
|
568
|
+
if (err) {
|
|
569
|
+
await replyToThread(key, err);
|
|
570
|
+
}
|
|
571
|
+
else {
|
|
572
|
+
await replyToThread(key, (0, i18n_1.t)('effort.set_success', { level: args }));
|
|
573
|
+
await updatePinnedStatus(key).catch(() => { });
|
|
574
|
+
}
|
|
575
|
+
return;
|
|
576
|
+
}
|
|
577
|
+
// No arg: show current effort + a button per available level.
|
|
578
|
+
let levels = [];
|
|
579
|
+
try {
|
|
580
|
+
levels = await adapter.getAvailableEffortLevels(key);
|
|
581
|
+
}
|
|
582
|
+
catch (e) {
|
|
583
|
+
console.error('[Bot] getAvailableEffortLevels:', e);
|
|
584
|
+
}
|
|
585
|
+
if (levels.length === 0) {
|
|
586
|
+
// Empty means the current model declares no variants (OpenCode) or the
|
|
587
|
+
// backend reports no levels — not an error, just nothing to pick.
|
|
588
|
+
await replyToThread(key, (0, i18n_1.t)('effort.not_available'));
|
|
589
|
+
return;
|
|
590
|
+
}
|
|
591
|
+
const cur = adapter.getEffort?.(key) ?? null;
|
|
592
|
+
await replyToThread(key, (0, i18n_1.t)('effort.choose', { current: cur ?? (0, i18n_1.t)('effort.current_none') }), buildEffortKeyboard(levels, cur));
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
function registerModelCallbacks() {
|
|
596
|
+
/**
|
|
597
|
+
* @description `/model` picker callbacks — the two-level provider → models
|
|
598
|
+
* keyboard. All of them are registered BEFORE the generic `model_(.+)$`
|
|
599
|
+
* handler below (which is the legacy "pick this model id" button kept for
|
|
600
|
+
* back-compat) so no prefix can be mis-matched; Telegraf dispatches action
|
|
601
|
+
* regexes first-match-wins, the same ordering rule `bind_page_(\d+)$` relies on.
|
|
602
|
+
*/
|
|
603
|
+
// Provider tapped (or a page arrow) → render that provider's model page.
|
|
604
|
+
bot.action(modelPickerPlan_1.providerPageCallbackRe, async (ctx) => {
|
|
605
|
+
const key = await authoriseContext(ctx);
|
|
606
|
+
if (!key) {
|
|
607
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.access_denied'));
|
|
608
|
+
return;
|
|
609
|
+
}
|
|
610
|
+
const adapter = (0, createAdapter_1.getThreadAdapter)(key);
|
|
611
|
+
const catalog = await getModelCatalog(adapter);
|
|
612
|
+
const render = buildModelPageRender(catalog, Number(ctx.match[1]), Number(ctx.match[2]), getCurrentModelLabel(adapter, key), { isWithNumberedList: true });
|
|
613
|
+
if (!render) {
|
|
614
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.model_provider_gone'));
|
|
615
|
+
return;
|
|
616
|
+
}
|
|
617
|
+
applyModelPagePickArming(key, render);
|
|
618
|
+
await editModelPickerMessage(ctx, render);
|
|
619
|
+
await ctx.answerCbQuery();
|
|
620
|
+
});
|
|
621
|
+
// Model tapped → same apply path as `/model <name>` and the numeric reply.
|
|
622
|
+
bot.action(modelPickerPlan_1.modelPickCallbackRe, async (ctx) => {
|
|
623
|
+
const key = await authoriseContext(ctx);
|
|
624
|
+
if (!key) {
|
|
625
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.access_denied'));
|
|
626
|
+
return;
|
|
627
|
+
}
|
|
628
|
+
const adapter = (0, createAdapter_1.getThreadAdapter)(key);
|
|
629
|
+
if (!adapter.setModel) {
|
|
630
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.not_supported', { label: adapter.label }));
|
|
631
|
+
return;
|
|
632
|
+
}
|
|
633
|
+
const catalog = await getModelCatalog(adapter);
|
|
634
|
+
const providerIndex = Number(ctx.match[1]);
|
|
635
|
+
const modelIndex = Number(ctx.match[2]);
|
|
636
|
+
const provider = catalog.providers[providerIndex];
|
|
637
|
+
const modelId = provider === undefined
|
|
638
|
+
? undefined
|
|
639
|
+
: catalog.byProvider.get(provider)?.[modelIndex];
|
|
640
|
+
if (modelId === undefined) {
|
|
641
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.model_provider_gone'));
|
|
642
|
+
return;
|
|
643
|
+
}
|
|
644
|
+
const { isOk, message, setModelError, displayLabel } = await applyModelSelection(adapter, key, modelId);
|
|
645
|
+
if (!isOk) {
|
|
646
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.model_error', { error: (setModelError ?? message).slice(0, 50) }));
|
|
647
|
+
return;
|
|
648
|
+
}
|
|
649
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.model_set', { model: displayLabel.split('/').pop() || displayLabel }));
|
|
650
|
+
// The pick is made, so the page's bare-digit affordance must go (an armed
|
|
651
|
+
// thread swallows a later ordinary "3" prompt) — and with it the numbers in
|
|
652
|
+
// the text. Re-render the SAME page so the ✓ moves to the model just picked.
|
|
653
|
+
const refreshed = buildModelPageRender(catalog, providerIndex, Math.floor(modelIndex / MODEL_PAGE_SIZE), getCurrentModelLabel(adapter, key), { isWithNumberedList: false });
|
|
654
|
+
if (refreshed) {
|
|
655
|
+
applyModelPagePickArming(key, refreshed);
|
|
656
|
+
await editModelPickerMessage(ctx, refreshed);
|
|
657
|
+
}
|
|
658
|
+
else {
|
|
659
|
+
clearModelPagePick(key);
|
|
660
|
+
}
|
|
661
|
+
await replyToThread(key, message);
|
|
662
|
+
});
|
|
663
|
+
// 🙈 / 👁 — the bot-side provider filter. GLOBAL for the instance and the only
|
|
664
|
+
// lever that works for a provider OpenCode enables from an environment
|
|
665
|
+
// variable, which `/disconnect` cannot remove.
|
|
666
|
+
bot.action(modelPickerPlan_1.providerHideCallbackRe, async (ctx) => {
|
|
667
|
+
const key = await authoriseContext(ctx);
|
|
668
|
+
if (!key) {
|
|
669
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.access_denied'));
|
|
670
|
+
return;
|
|
671
|
+
}
|
|
672
|
+
const catalog = await getModelCatalog((0, createAdapter_1.getThreadAdapter)(key));
|
|
673
|
+
const provider = catalog.providers[Number(ctx.match[1])];
|
|
674
|
+
if (provider === undefined) {
|
|
675
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.model_provider_gone'));
|
|
676
|
+
return;
|
|
677
|
+
}
|
|
678
|
+
await getState().setModelProviderHidden(provider, true);
|
|
679
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.model_hidden', { provider }));
|
|
680
|
+
await refreshModelProviderLevel(ctx, key);
|
|
681
|
+
});
|
|
682
|
+
bot.action(modelPickerPlan_1.providerShowCallbackRe, async (ctx) => {
|
|
683
|
+
const key = await authoriseContext(ctx);
|
|
684
|
+
if (!key) {
|
|
685
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.access_denied'));
|
|
686
|
+
return;
|
|
687
|
+
}
|
|
688
|
+
const catalog = await getModelCatalog((0, createAdapter_1.getThreadAdapter)(key));
|
|
689
|
+
const provider = catalog.providers[Number(ctx.match[1])];
|
|
690
|
+
if (provider === undefined) {
|
|
691
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.model_provider_gone'));
|
|
692
|
+
return;
|
|
693
|
+
}
|
|
694
|
+
await getState().setModelProviderHidden(provider, false);
|
|
695
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.model_shown', { provider }));
|
|
696
|
+
await refreshModelProviderLevel(ctx, key);
|
|
697
|
+
});
|
|
698
|
+
// «⬅️ providers» — back to the provider level.
|
|
699
|
+
bot.action(modelPickerPlan_1.modelPickerBackCallback, async (ctx) => {
|
|
700
|
+
const key = await authoriseContext(ctx);
|
|
701
|
+
if (!key) {
|
|
702
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.access_denied'));
|
|
703
|
+
return;
|
|
704
|
+
}
|
|
705
|
+
await ctx.answerCbQuery();
|
|
706
|
+
await refreshModelProviderLevel(ctx, key);
|
|
707
|
+
});
|
|
708
|
+
// Inert label buttons (the "2/5" page pill, a hidden provider's name).
|
|
709
|
+
bot.action(modelPickerPlan_1.modelPickerNoopCallback, async (ctx) => {
|
|
710
|
+
await ctx.answerCbQuery();
|
|
711
|
+
});
|
|
712
|
+
// Bare-`/disconnect` picker row → drop that provider's stored credentials.
|
|
713
|
+
// Resolved against the snapshot of the message the button sits on, so an older
|
|
714
|
+
// picker left in the history can never map its index onto a newer list and
|
|
715
|
+
// delete the wrong provider's credentials.
|
|
716
|
+
bot.action(providerDisconnectPlan_1.disconnectProviderCallbackRe, async (ctx) => {
|
|
717
|
+
const key = await authoriseContext(ctx);
|
|
718
|
+
if (!key) {
|
|
719
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.access_denied'));
|
|
720
|
+
return;
|
|
721
|
+
}
|
|
722
|
+
const provider = (0, providerDisconnectPlan_1.getDisconnectPickerProviderAt)(disconnectProviderLists, (0, sessionKey_1.keyToString)(key), (0, callbackMessage_1.getCallbackMessageId)(ctx), Number(ctx.match[1]));
|
|
723
|
+
if (provider === null) {
|
|
724
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.disconnect_expired'));
|
|
725
|
+
return;
|
|
726
|
+
}
|
|
727
|
+
await ctx.answerCbQuery();
|
|
728
|
+
await applyProviderDisconnect(key, provider);
|
|
729
|
+
});
|
|
730
|
+
bot.action(/^model_(.+)$/, async (ctx) => {
|
|
731
|
+
const key = await authoriseContext(ctx);
|
|
732
|
+
if (!key) {
|
|
733
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.access_denied'));
|
|
734
|
+
return;
|
|
735
|
+
}
|
|
736
|
+
const modelId = ctx.match[1];
|
|
737
|
+
const adapter = (0, createAdapter_1.getThreadAdapter)(key);
|
|
738
|
+
// No bot-side session gate: the adapter owns the no-session decision
|
|
739
|
+
// (OpenCode persists the pick for next start and succeeds; Claude refuses
|
|
740
|
+
// with a notice surfaced as the error toast below).
|
|
741
|
+
if (!adapter.setModel) {
|
|
742
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.not_supported', { label: adapter.label }));
|
|
743
|
+
return;
|
|
744
|
+
}
|
|
745
|
+
const { isOk, message, setModelError, displayLabel } = await applyModelSelection(adapter, key, modelId);
|
|
746
|
+
if (!isOk) {
|
|
747
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.model_error', { error: (setModelError ?? message).slice(0, 50) }));
|
|
748
|
+
return;
|
|
749
|
+
}
|
|
750
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.model_set', { model: displayLabel.split('/').pop() || displayLabel }));
|
|
751
|
+
await replyToThread(key, message);
|
|
752
|
+
});
|
|
753
|
+
bot.action(/^connm_(\d+)$/, async (ctx) => {
|
|
754
|
+
const key = await authoriseContext(ctx);
|
|
755
|
+
if (!key) {
|
|
756
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.access_denied'));
|
|
757
|
+
return;
|
|
758
|
+
}
|
|
759
|
+
const entry = connectMethodLists.get((0, sessionKey_1.keyToString)(key));
|
|
760
|
+
const idx = Number(ctx.match[1]);
|
|
761
|
+
const method = entry?.methods[idx];
|
|
762
|
+
if (!entry || !method) {
|
|
763
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.connect_method_expired'));
|
|
764
|
+
return;
|
|
765
|
+
}
|
|
766
|
+
await ctx.answerCbQuery();
|
|
767
|
+
if ((0, openCodeAuthLogin_1.checkIsOAuthMethod)(method)) {
|
|
768
|
+
// OAuth (subscription/account): drive `opencode auth login` out-of-band.
|
|
769
|
+
await startOpenCodeOAuthLogin(key, entry.providerId, method.label);
|
|
770
|
+
return;
|
|
771
|
+
}
|
|
772
|
+
// API-key method: arm the existing key-paste flow (next message is the key).
|
|
773
|
+
armProviderConnect(key, entry.providerId);
|
|
774
|
+
await replyToThread(key, (0, i18n_1.t)('connect.prompt_key', { provider: entry.providerId }));
|
|
775
|
+
});
|
|
776
|
+
bot.action(/^effort_(.+)$/, async (ctx) => {
|
|
777
|
+
const key = await authoriseContext(ctx);
|
|
778
|
+
if (!key) {
|
|
779
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.access_denied'));
|
|
780
|
+
return;
|
|
781
|
+
}
|
|
782
|
+
const level = ctx.match[1];
|
|
783
|
+
const adapter = (0, createAdapter_1.getThreadAdapter)(key);
|
|
784
|
+
// No `checkIsActive` gate — effort is persisted pre-session (mirrors the
|
|
785
|
+
// `/effort` command and `/model`). The adapter returns its own notice if the
|
|
786
|
+
// pick can't apply live; we surface it via `cb.effort_error` below.
|
|
787
|
+
if (!adapter.setEffort) {
|
|
788
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.not_supported', { label: adapter.label }));
|
|
789
|
+
return;
|
|
790
|
+
}
|
|
791
|
+
const wakeNotice = await wakeSleepingSession(key); // L-D4: apply to the woken session
|
|
792
|
+
if (wakeNotice)
|
|
793
|
+
await replyToThread(key, wakeNotice);
|
|
794
|
+
const err = await adapter.setEffort(key, level);
|
|
795
|
+
if (err) {
|
|
796
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.effort_error', { error: err.slice(0, 50) }));
|
|
797
|
+
return;
|
|
798
|
+
}
|
|
799
|
+
await ctx.answerCbQuery((0, i18n_1.t)('cb.effort_set', { level }));
|
|
800
|
+
await replyToThread(key, (0, i18n_1.t)('effort.set_success', { level }));
|
|
801
|
+
await updatePinnedStatus(key).catch(() => { });
|
|
802
|
+
// Re-render the picker so the `✓` marker follows the new level instead of
|
|
803
|
+
// staying stuck on the previously-selected one (B12). The current level is
|
|
804
|
+
// the freshly-set one; fall back to `level` if the adapter can't report it.
|
|
805
|
+
const cbMsg = ctx.callbackQuery?.message;
|
|
806
|
+
if (cbMsg && adapter.getAvailableEffortLevels) {
|
|
807
|
+
let levels = [];
|
|
808
|
+
try {
|
|
809
|
+
levels = await adapter.getAvailableEffortLevels(key);
|
|
810
|
+
}
|
|
811
|
+
catch (e) {
|
|
812
|
+
console.error('[effort_cb] getAvailableEffortLevels:', e);
|
|
813
|
+
}
|
|
814
|
+
if (levels.length > 0) {
|
|
815
|
+
const cur = adapter.getEffort?.(key) ?? level;
|
|
816
|
+
const keyboard = buildEffortKeyboard(levels, cur);
|
|
817
|
+
try {
|
|
818
|
+
await (0, rateLimiter_1.enqueueSend)(key, () => bot.telegram.editMessageReplyMarkup((0, sessionKeyCodec_1.getTelegramChatId)(key), cbMsg.message_id, undefined, keyboard.reply_markup));
|
|
819
|
+
}
|
|
820
|
+
catch (e) {
|
|
821
|
+
const desc = (0, sendErrorClassifier_1.checkIsApiError)(e) ? (0, sendErrorClassifier_1.getErrorDescription)(e) : '';
|
|
822
|
+
if (!/message is not modified/i.test(desc)) {
|
|
823
|
+
console.warn('[effort_cb] keyboard re-render failed:', desc || e);
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
});
|
|
829
|
+
}
|
|
830
|
+
return {
|
|
831
|
+
handleProviderConnectKey,
|
|
832
|
+
applyNumberedModelPick,
|
|
833
|
+
applyModelPagePickArming,
|
|
834
|
+
checkIsNumberedModelPickArmed,
|
|
835
|
+
getNumberedModelPick,
|
|
836
|
+
registerProviderCommands,
|
|
837
|
+
registerModelCommands,
|
|
838
|
+
registerModelCallbacks,
|
|
839
|
+
};
|
|
840
|
+
}
|
|
841
|
+
//# sourceMappingURL=modelProviders.js.map
|