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,943 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.openCodeOwnershipFileEnvName = exports.openCodeExternalHostEnvValue = exports.openCodeExternalHostEnvName = exports.defaultOpenCodeUrl = void 0;
|
|
37
|
+
exports.getOpenCodePort = getOpenCodePort;
|
|
38
|
+
exports.checkIsInstalled = checkIsInstalled;
|
|
39
|
+
exports.getToolCommand = getToolCommand;
|
|
40
|
+
exports.installTool = installTool;
|
|
41
|
+
exports.ensureInstalled = ensureInstalled;
|
|
42
|
+
exports.getOpenCodeChildEnv = getOpenCodeChildEnv;
|
|
43
|
+
exports.startExternallyParentedProcess = startExternallyParentedProcess;
|
|
44
|
+
exports.getDefaultOpenCodeOwnershipFilePath = getDefaultOpenCodeOwnershipFilePath;
|
|
45
|
+
exports.checkIsProcessIdentityCurrent = checkIsProcessIdentityCurrent;
|
|
46
|
+
exports.signalExternallyHostedProcess = signalExternallyHostedProcess;
|
|
47
|
+
exports.onOpenCodeServerExit = onOpenCodeServerExit;
|
|
48
|
+
exports.checkIsOpenCodeServerRunning = checkIsOpenCodeServerRunning;
|
|
49
|
+
exports.extractOpenCodeVersion = extractOpenCodeVersion;
|
|
50
|
+
exports.getOpenCodeServerHealth = getOpenCodeServerHealth;
|
|
51
|
+
exports.checkIsOpenCodeServerStale = checkIsOpenCodeServerStale;
|
|
52
|
+
exports.ensureOpenCodeServer = ensureOpenCodeServer;
|
|
53
|
+
exports.restartOpenCodeServer = restartOpenCodeServer;
|
|
54
|
+
exports.stopOpenCodeServer = stopOpenCodeServer;
|
|
55
|
+
const child_process_1 = require("child_process");
|
|
56
|
+
const fs = __importStar(require("fs"));
|
|
57
|
+
const os = __importStar(require("os"));
|
|
58
|
+
const path = __importStar(require("path"));
|
|
59
|
+
const utils_1 = require("./utils");
|
|
60
|
+
const openCodeCompactPlugin_1 = require("./utils/openCodeCompactPlugin");
|
|
61
|
+
/**
|
|
62
|
+
* The OpenCode server URL when `OPENCODE_URL` is unset — also every OTHER
|
|
63
|
+
* instance's default on this host, which is why a Jira instance refuses it.
|
|
64
|
+
*/
|
|
65
|
+
exports.defaultOpenCodeUrl = 'http://localhost:4096';
|
|
66
|
+
const defaultOpenCodePort = new URL(exports.defaultOpenCodeUrl).port;
|
|
67
|
+
/** The port an OpenCode URL names; a URL without one means the default port (as `opencode serve` binds it). */
|
|
68
|
+
function getOpenCodePort(serverUrl) {
|
|
69
|
+
return serverUrl.port || defaultOpenCodePort;
|
|
70
|
+
}
|
|
71
|
+
const npmPrefix = (process.env.HOME || '/home/agent') + '/.npm-global';
|
|
72
|
+
/** Map of tool name → npm package name */
|
|
73
|
+
const toolPackages = {
|
|
74
|
+
claude: '@anthropic-ai/claude-code',
|
|
75
|
+
opencode: 'opencode-ai',
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* @description Get custom binary path for a tool if configured via env var.
|
|
79
|
+
* E.g. OPENCODE_BIN=/path/to/opencode for custom opencode binary.
|
|
80
|
+
*/
|
|
81
|
+
function getCustomBinaryPath(toolName) {
|
|
82
|
+
const envVar = `${toolName.toUpperCase()}_BIN`;
|
|
83
|
+
const customPath = process.env[envVar];
|
|
84
|
+
if (customPath && fs.existsSync(customPath)) {
|
|
85
|
+
return customPath;
|
|
86
|
+
}
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* @description Check if a CLI tool is installed and available in PATH.
|
|
91
|
+
* Also checks for custom binary path via TOOL_BIN env var.
|
|
92
|
+
*/
|
|
93
|
+
function checkIsInstalled(toolName) {
|
|
94
|
+
// Check custom binary path first
|
|
95
|
+
if (getCustomBinaryPath(toolName)) {
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
(0, child_process_1.execSync)(`which ${toolName}`, { encoding: 'utf-8', timeout: 5000, stdio: 'pipe' });
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* @description Get the command/path to run a tool.
|
|
108
|
+
* Uses custom binary if TOOL_BIN env var is set.
|
|
109
|
+
*/
|
|
110
|
+
function getToolCommand(toolName) {
|
|
111
|
+
const customPath = getCustomBinaryPath(toolName);
|
|
112
|
+
if (customPath) {
|
|
113
|
+
return customPath;
|
|
114
|
+
}
|
|
115
|
+
return toolName;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* @description Install a CLI tool via npm global install.
|
|
119
|
+
* Installs to ~/.npm-global/bin/ which is persisted in docker volume.
|
|
120
|
+
*/
|
|
121
|
+
async function installTool(toolName) {
|
|
122
|
+
const packageName = toolPackages[toolName];
|
|
123
|
+
if (!packageName) {
|
|
124
|
+
throw new Error(`Unknown tool: ${toolName}. Available: ${Object.keys(toolPackages).join(', ')}`);
|
|
125
|
+
}
|
|
126
|
+
console.log(`[Install] Installing ${toolName} (${packageName})...`);
|
|
127
|
+
return new Promise((resolve, reject) => {
|
|
128
|
+
(0, child_process_1.exec)(`NPM_CONFIG_PREFIX=${npmPrefix} npm install -g ${packageName}`, { timeout: 120000, encoding: 'utf-8' }, (error, stdout, stderr) => {
|
|
129
|
+
if (error) {
|
|
130
|
+
console.error(`[Install] Failed to install ${toolName}:`, stderr);
|
|
131
|
+
reject(new Error(`Failed to install ${toolName}: ${error.message}`));
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
console.log(`[Install] ${toolName} installed successfully`);
|
|
135
|
+
if (stdout.trim())
|
|
136
|
+
console.log(stdout.trim());
|
|
137
|
+
resolve();
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* @description Ensure a tool is installed. Install if missing.
|
|
143
|
+
* Returns true if tool was already installed, false if it had to be installed.
|
|
144
|
+
*/
|
|
145
|
+
async function ensureInstalled(toolName) {
|
|
146
|
+
if (checkIsInstalled(toolName)) {
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
await installTool(toolName);
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
// ═══════════════════════════════════════════
|
|
153
|
+
// OpenCode server process management
|
|
154
|
+
// ═══════════════════════════════════════════
|
|
155
|
+
let openCodeProcess = null;
|
|
156
|
+
let ownedOpenCodeProcess = null;
|
|
157
|
+
let openCodeServerLifecycleTail = Promise.resolve();
|
|
158
|
+
exports.openCodeExternalHostEnvName = 'TELEGRAMCODE_HOT_RELOAD';
|
|
159
|
+
exports.openCodeExternalHostEnvValue = '1';
|
|
160
|
+
exports.openCodeOwnershipFileEnvName = 'TELEGRAMCODE_OPENCODE_PROCESS_FILE';
|
|
161
|
+
function getOpenCodeChildEnv(baseEnv = process.env) {
|
|
162
|
+
const childEnv = { ...baseEnv };
|
|
163
|
+
delete childEnv[exports.openCodeExternalHostEnvName];
|
|
164
|
+
delete childEnv[exports.openCodeOwnershipFileEnvName];
|
|
165
|
+
return childEnv;
|
|
166
|
+
}
|
|
167
|
+
const externalProcessHostStartTimeoutMs = 5_000;
|
|
168
|
+
const externalProcessHostAbortTimeoutMs = 2_000;
|
|
169
|
+
const externalProcessHostScript = `
|
|
170
|
+
const { spawn } = require('node:child_process');
|
|
171
|
+
const command = process.argv[1];
|
|
172
|
+
const args = JSON.parse(process.argv[2]);
|
|
173
|
+
let isReleased = false;
|
|
174
|
+
let shouldAbort = false;
|
|
175
|
+
let isAborting = false;
|
|
176
|
+
const child = spawn(command, args, {
|
|
177
|
+
env: process.env,
|
|
178
|
+
detached: true,
|
|
179
|
+
windowsHide: true,
|
|
180
|
+
stdio: 'inherit',
|
|
181
|
+
});
|
|
182
|
+
const finishAbort = () => {
|
|
183
|
+
process.disconnect?.();
|
|
184
|
+
process.exitCode = 1;
|
|
185
|
+
};
|
|
186
|
+
const abortChild = () => {
|
|
187
|
+
shouldAbort = true;
|
|
188
|
+
if (isAborting || !child.pid) return;
|
|
189
|
+
isAborting = true;
|
|
190
|
+
child.once('exit', finishAbort);
|
|
191
|
+
try {
|
|
192
|
+
process.kill(process.platform === 'win32' ? child.pid : -child.pid, 'SIGKILL');
|
|
193
|
+
} catch {
|
|
194
|
+
try {
|
|
195
|
+
child.kill('SIGKILL');
|
|
196
|
+
} catch {
|
|
197
|
+
finishAbort();
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
process.on('message', (message) => {
|
|
202
|
+
if (message?.action === 'release' && !shouldAbort) {
|
|
203
|
+
isReleased = true;
|
|
204
|
+
child.unref();
|
|
205
|
+
process.disconnect?.();
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (message?.action === 'abort') abortChild();
|
|
209
|
+
});
|
|
210
|
+
process.on('disconnect', () => {
|
|
211
|
+
if (!isReleased) abortChild();
|
|
212
|
+
});
|
|
213
|
+
child.once('error', (error) => {
|
|
214
|
+
process.send?.({ error: error.message });
|
|
215
|
+
process.disconnect?.();
|
|
216
|
+
process.exitCode = 1;
|
|
217
|
+
});
|
|
218
|
+
child.once('spawn', () => {
|
|
219
|
+
process.send?.({ pid: child.pid });
|
|
220
|
+
if (shouldAbort) abortChild();
|
|
221
|
+
});
|
|
222
|
+
`;
|
|
223
|
+
/** Callback invoked when the OpenCode server process exits unexpectedly (not via stopOpenCodeServer) */
|
|
224
|
+
let onServerExitCallback = null;
|
|
225
|
+
const intentionallyStoppedProcesses = new WeakSet();
|
|
226
|
+
const relinquishedProcesses = new WeakSet();
|
|
227
|
+
/**
|
|
228
|
+
* @description Start a process through a one-shot Node host. The host exits
|
|
229
|
+
* before this promise resolves, so the long-lived process is reparented outside
|
|
230
|
+
* the caller's process tree. Hot-mode workers use this because nodemon kills a
|
|
231
|
+
* snapshot of every descendant on reload, including ordinary detached children.
|
|
232
|
+
*/
|
|
233
|
+
function startExternallyParentedProcess(command, args, env, options = {}) {
|
|
234
|
+
return new Promise((resolve, reject) => {
|
|
235
|
+
const host = (0, child_process_1.spawn)(process.execPath, ['-e', options.hostScript ?? externalProcessHostScript, command, JSON.stringify(args)], {
|
|
236
|
+
env,
|
|
237
|
+
stdio: ['ignore', 'inherit', 'inherit', 'ipc'],
|
|
238
|
+
});
|
|
239
|
+
let hostedProcess = null;
|
|
240
|
+
let hostError = null;
|
|
241
|
+
let pendingError = null;
|
|
242
|
+
let isSettled = false;
|
|
243
|
+
let abortTimeout = null;
|
|
244
|
+
const settleWithError = (error) => {
|
|
245
|
+
if (isSettled)
|
|
246
|
+
return;
|
|
247
|
+
isSettled = true;
|
|
248
|
+
clearTimeout(timeout);
|
|
249
|
+
if (abortTimeout)
|
|
250
|
+
clearTimeout(abortTimeout);
|
|
251
|
+
if (hostedProcess) {
|
|
252
|
+
signalExternallyHostedProcess(hostedProcess, 'SIGKILL');
|
|
253
|
+
}
|
|
254
|
+
reject(error);
|
|
255
|
+
};
|
|
256
|
+
const requestAbort = (error) => {
|
|
257
|
+
if (isSettled || pendingError)
|
|
258
|
+
return;
|
|
259
|
+
pendingError = error;
|
|
260
|
+
clearTimeout(timeout);
|
|
261
|
+
if (hostedProcess) {
|
|
262
|
+
signalExternallyHostedProcess(hostedProcess, 'SIGKILL');
|
|
263
|
+
}
|
|
264
|
+
if (host.connected)
|
|
265
|
+
host.send({ action: 'abort' });
|
|
266
|
+
abortTimeout = setTimeout(() => {
|
|
267
|
+
host.kill('SIGKILL');
|
|
268
|
+
settleWithError(error);
|
|
269
|
+
}, externalProcessHostAbortTimeoutMs);
|
|
270
|
+
};
|
|
271
|
+
const timeout = setTimeout(() => {
|
|
272
|
+
requestAbort(new Error('External process host did not exit after starting its child'));
|
|
273
|
+
}, options.timeoutMs ?? externalProcessHostStartTimeoutMs);
|
|
274
|
+
host.on('message', (message) => {
|
|
275
|
+
if (!message || typeof message !== 'object')
|
|
276
|
+
return;
|
|
277
|
+
if ('pid' in message && typeof message.pid === 'number') {
|
|
278
|
+
const processIdentity = (options.resolveProcessIdentity ?? getProcessIdentity)(message.pid);
|
|
279
|
+
if (processIdentity) {
|
|
280
|
+
hostedProcess = processIdentity;
|
|
281
|
+
if (!pendingError) {
|
|
282
|
+
try {
|
|
283
|
+
options.prepareProcessIdentity?.(processIdentity);
|
|
284
|
+
host.send({ action: 'release' }, (error) => {
|
|
285
|
+
if (error)
|
|
286
|
+
requestAbort(error);
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
requestAbort(error instanceof Error ? error : new Error(error?.toString() ?? 'unknown error'));
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
hostError = `could not identify child process ${message.pid}`;
|
|
296
|
+
requestAbort(new Error(`External process host failed: ${hostError}`));
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if ('error' in message && typeof message.error === 'string') {
|
|
300
|
+
hostError = message.error;
|
|
301
|
+
requestAbort(new Error(`External process host failed: ${hostError}`));
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
host.once('error', settleWithError);
|
|
305
|
+
host.once('exit', (code, signal) => {
|
|
306
|
+
if (isSettled)
|
|
307
|
+
return;
|
|
308
|
+
clearTimeout(timeout);
|
|
309
|
+
if (abortTimeout)
|
|
310
|
+
clearTimeout(abortTimeout);
|
|
311
|
+
if (pendingError) {
|
|
312
|
+
settleWithError(pendingError);
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
if (hostError) {
|
|
316
|
+
settleWithError(new Error(`External process host failed: ${hostError}`));
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
if (code !== 0 || !hostedProcess || !checkIsProcessIdentityCurrent(hostedProcess)) {
|
|
320
|
+
settleWithError(new Error(`External process host exited before starting its child ` +
|
|
321
|
+
`(code=${code ?? 'null'}, signal=${signal ?? 'null'})`));
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
isSettled = true;
|
|
325
|
+
resolve(hostedProcess);
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
function getProcessIdentity(pid) {
|
|
330
|
+
const startToken = getProcessStartToken(pid);
|
|
331
|
+
return startToken ? { pid, startToken } : null;
|
|
332
|
+
}
|
|
333
|
+
function getDefaultOpenCodeOwnershipFilePath(baseDirectory = process.cwd()) {
|
|
334
|
+
const dataDirectory = process.env.DATA_DIR || path.join(os.homedir(), '.telegramCode');
|
|
335
|
+
return path.join(path.resolve(baseDirectory, dataDirectory), '.opencode-server-process');
|
|
336
|
+
}
|
|
337
|
+
function saveOpenCodeServerProcessOwnership(processOwnership) {
|
|
338
|
+
const ownershipFilePath = process.env[exports.openCodeOwnershipFileEnvName];
|
|
339
|
+
if (!ownershipFilePath)
|
|
340
|
+
return;
|
|
341
|
+
const ownershipDirectory = path.dirname(ownershipFilePath);
|
|
342
|
+
const temporaryPath = `${ownershipFilePath}.tmp-${process.pid}`;
|
|
343
|
+
fs.mkdirSync(ownershipDirectory, { recursive: true, mode: 0o700 });
|
|
344
|
+
fs.writeFileSync(temporaryPath, `${processOwnership.pid}\n${processOwnership.startToken}\n` +
|
|
345
|
+
`${processOwnership.endpoint}\n${processOwnership.signalProcessGroup ? 'group' : 'process'}\n` +
|
|
346
|
+
`${processOwnership.state}\n`, { mode: 0o600 });
|
|
347
|
+
fs.renameSync(temporaryPath, ownershipFilePath);
|
|
348
|
+
}
|
|
349
|
+
const loopbackHostnames = new Set(['localhost', '127.0.0.1', '::1', '[::1]']);
|
|
350
|
+
function saveHealthyOpenCodeServerOwnership(endpoint, hostname, port) {
|
|
351
|
+
if (!process.env[exports.openCodeOwnershipFileEnvName] || !loopbackHostnames.has(hostname))
|
|
352
|
+
return;
|
|
353
|
+
const processOwnership = getOwnedOpenCodeProcessOwnership(endpoint);
|
|
354
|
+
if (processOwnership) {
|
|
355
|
+
const readyProcessOwnership = {
|
|
356
|
+
...processOwnership,
|
|
357
|
+
state: 'ready',
|
|
358
|
+
};
|
|
359
|
+
ownedOpenCodeProcess = readyProcessOwnership;
|
|
360
|
+
saveOpenCodeServerProcessOwnership(readyProcessOwnership);
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
const listenerPid = getPidListeningOnEndpoint(hostname, port);
|
|
364
|
+
const listenerIdentity = listenerPid ? getProcessIdentity(listenerPid) : null;
|
|
365
|
+
if (!listenerIdentity)
|
|
366
|
+
return;
|
|
367
|
+
ownedOpenCodeProcess = {
|
|
368
|
+
...listenerIdentity,
|
|
369
|
+
endpoint,
|
|
370
|
+
signalProcessGroup: false,
|
|
371
|
+
state: 'ready',
|
|
372
|
+
};
|
|
373
|
+
saveOpenCodeServerProcessOwnership(ownedOpenCodeProcess);
|
|
374
|
+
}
|
|
375
|
+
function getPersistedOpenCodeProcessOwnership(expectedEndpoint) {
|
|
376
|
+
const ownershipFilePath = process.env[exports.openCodeOwnershipFileEnvName];
|
|
377
|
+
if (!ownershipFilePath || !fs.existsSync(ownershipFilePath))
|
|
378
|
+
return null;
|
|
379
|
+
try {
|
|
380
|
+
const [pidText, startToken, endpoint, signalScope, persistedState = 'ready'] = fs
|
|
381
|
+
.readFileSync(ownershipFilePath, 'utf8')
|
|
382
|
+
.trim()
|
|
383
|
+
.split('\n');
|
|
384
|
+
const pid = Number.parseInt(pidText, 10);
|
|
385
|
+
if (!Number.isInteger(pid) ||
|
|
386
|
+
pid <= 0 ||
|
|
387
|
+
!startToken ||
|
|
388
|
+
!endpoint ||
|
|
389
|
+
(signalScope !== 'group' && signalScope !== 'process') ||
|
|
390
|
+
(persistedState !== 'starting' && persistedState !== 'ready')) {
|
|
391
|
+
fs.rmSync(ownershipFilePath, { force: true });
|
|
392
|
+
return null;
|
|
393
|
+
}
|
|
394
|
+
if (expectedEndpoint && endpoint !== expectedEndpoint)
|
|
395
|
+
return null;
|
|
396
|
+
const processOwnership = {
|
|
397
|
+
pid,
|
|
398
|
+
startToken,
|
|
399
|
+
endpoint,
|
|
400
|
+
signalProcessGroup: signalScope === 'group',
|
|
401
|
+
state: persistedState,
|
|
402
|
+
};
|
|
403
|
+
if (checkIsProcessIdentityCurrent(processOwnership) &&
|
|
404
|
+
(!expectedEndpoint || checkIsOpenCodeProcessOwnershipCurrent(processOwnership))) {
|
|
405
|
+
return processOwnership;
|
|
406
|
+
}
|
|
407
|
+
fs.rmSync(ownershipFilePath, { force: true });
|
|
408
|
+
return null;
|
|
409
|
+
}
|
|
410
|
+
catch (error) {
|
|
411
|
+
console.warn(`[OpenCode] Failed to read process ownership file ${ownershipFilePath}:`, error instanceof Error ? error.message : error);
|
|
412
|
+
return null;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
function clearPersistedOpenCodeProcessOwnership(processOwnership) {
|
|
416
|
+
const ownershipFilePath = process.env[exports.openCodeOwnershipFileEnvName];
|
|
417
|
+
if (!ownershipFilePath || !fs.existsSync(ownershipFilePath))
|
|
418
|
+
return;
|
|
419
|
+
try {
|
|
420
|
+
const persistedOwnership = getPersistedOpenCodeProcessOwnership();
|
|
421
|
+
if (persistedOwnership?.pid === processOwnership.pid &&
|
|
422
|
+
persistedOwnership.startToken === processOwnership.startToken &&
|
|
423
|
+
persistedOwnership.endpoint === processOwnership.endpoint) {
|
|
424
|
+
fs.rmSync(ownershipFilePath, { force: true });
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
catch (error) {
|
|
428
|
+
console.warn(`[OpenCode] Failed to clear process ownership file ${ownershipFilePath}:`, error instanceof Error ? error.message : error);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
function getProcessStartToken(pid) {
|
|
432
|
+
try {
|
|
433
|
+
if (process.platform === 'linux') {
|
|
434
|
+
const stat = fs.readFileSync(`/proc/${pid}/stat`, 'utf8');
|
|
435
|
+
const commandEndIndex = stat.lastIndexOf(')');
|
|
436
|
+
if (commandEndIndex < 0)
|
|
437
|
+
return null;
|
|
438
|
+
// Fields after the command start at #3 (state); process start time is #22.
|
|
439
|
+
const processFields = stat.slice(commandEndIndex + 1).trim().split(/\s+/);
|
|
440
|
+
if (processFields[0] === 'Z')
|
|
441
|
+
return null;
|
|
442
|
+
return processFields[19] ?? null;
|
|
443
|
+
}
|
|
444
|
+
if (process.platform === 'win32') {
|
|
445
|
+
const output = (0, child_process_1.execFileSync)('powershell.exe', [
|
|
446
|
+
'-NoProfile',
|
|
447
|
+
'-NonInteractive',
|
|
448
|
+
'-Command',
|
|
449
|
+
`(Get-Process -Id ${pid} -ErrorAction Stop).StartTime.ToUniversalTime().Ticks`,
|
|
450
|
+
], { encoding: 'utf8', timeout: 3000 });
|
|
451
|
+
return output.trim() || null;
|
|
452
|
+
}
|
|
453
|
+
const output = (0, child_process_1.execFileSync)('ps', ['-o', 'lstart=', '-o', 'command=', '-p', pid.toString()], {
|
|
454
|
+
encoding: 'utf8',
|
|
455
|
+
timeout: 3000,
|
|
456
|
+
});
|
|
457
|
+
return output.trim() || null;
|
|
458
|
+
}
|
|
459
|
+
catch {
|
|
460
|
+
return null;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
function checkIsProcessIdentityCurrent(processIdentity) {
|
|
464
|
+
return getProcessStartToken(processIdentity.pid) === processIdentity.startToken;
|
|
465
|
+
}
|
|
466
|
+
function checkIsOpenCodeProcessOwnershipCurrent(processOwnership) {
|
|
467
|
+
if (!checkIsProcessIdentityCurrent(processOwnership))
|
|
468
|
+
return false;
|
|
469
|
+
if (processOwnership.state === 'starting' && processOwnership.signalProcessGroup) {
|
|
470
|
+
return true;
|
|
471
|
+
}
|
|
472
|
+
const serverUrl = new URL(processOwnership.endpoint);
|
|
473
|
+
const port = getOpenCodePort(serverUrl);
|
|
474
|
+
return getPidListeningOnEndpoint(serverUrl.hostname, port) === processOwnership.pid;
|
|
475
|
+
}
|
|
476
|
+
function signalExternallyHostedProcess(processIdentity, signal) {
|
|
477
|
+
return signalProcessIdentity(processIdentity, signal, true);
|
|
478
|
+
}
|
|
479
|
+
function signalProcessIdentity(processIdentity, signal, signalProcessGroup) {
|
|
480
|
+
if (!checkIsProcessIdentityCurrent(processIdentity))
|
|
481
|
+
return false;
|
|
482
|
+
try {
|
|
483
|
+
const targetPid = signalProcessGroup && process.platform !== 'win32'
|
|
484
|
+
? -processIdentity.pid
|
|
485
|
+
: processIdentity.pid;
|
|
486
|
+
process.kill(targetPid, signal);
|
|
487
|
+
return true;
|
|
488
|
+
}
|
|
489
|
+
catch (error) {
|
|
490
|
+
if (checkIsProcessIdentityCurrent(processIdentity)) {
|
|
491
|
+
console.warn(`[OpenCode] Failed to signal process ${processIdentity.pid}:`, error instanceof Error ? error.message : error);
|
|
492
|
+
}
|
|
493
|
+
return false;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
function getOwnedOpenCodeProcessOwnership(endpoint) {
|
|
497
|
+
if (ownedOpenCodeProcess) {
|
|
498
|
+
if (ownedOpenCodeProcess.endpoint !== endpoint) {
|
|
499
|
+
if (openCodeProcess?.pid === ownedOpenCodeProcess.pid) {
|
|
500
|
+
relinquishedProcesses.add(openCodeProcess);
|
|
501
|
+
openCodeProcess = null;
|
|
502
|
+
}
|
|
503
|
+
ownedOpenCodeProcess = null;
|
|
504
|
+
}
|
|
505
|
+
else if (checkIsOpenCodeProcessOwnershipCurrent(ownedOpenCodeProcess)) {
|
|
506
|
+
return ownedOpenCodeProcess;
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
clearPersistedOpenCodeProcessOwnership(ownedOpenCodeProcess);
|
|
510
|
+
ownedOpenCodeProcess = null;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
const persistedOwnership = getPersistedOpenCodeProcessOwnership(endpoint);
|
|
514
|
+
if (persistedOwnership) {
|
|
515
|
+
ownedOpenCodeProcess = persistedOwnership;
|
|
516
|
+
}
|
|
517
|
+
return persistedOwnership;
|
|
518
|
+
}
|
|
519
|
+
function checkHasOwnedOpenCodeProcess(endpoint) {
|
|
520
|
+
return getOwnedOpenCodeProcessOwnership(endpoint) !== null;
|
|
521
|
+
}
|
|
522
|
+
function clearOwnedOpenCodeProcessOwnership(processOwnership) {
|
|
523
|
+
if (openCodeProcess?.pid === processOwnership.pid) {
|
|
524
|
+
openCodeProcess = null;
|
|
525
|
+
}
|
|
526
|
+
if (ownedOpenCodeProcess?.pid === processOwnership.pid &&
|
|
527
|
+
ownedOpenCodeProcess.startToken === processOwnership.startToken &&
|
|
528
|
+
ownedOpenCodeProcess.endpoint === processOwnership.endpoint) {
|
|
529
|
+
ownedOpenCodeProcess = null;
|
|
530
|
+
}
|
|
531
|
+
clearPersistedOpenCodeProcessOwnership(processOwnership);
|
|
532
|
+
}
|
|
533
|
+
function runOpenCodeServerLifecycle(operation) {
|
|
534
|
+
const currentOperation = openCodeServerLifecycleTail.then(operation, operation);
|
|
535
|
+
openCodeServerLifecycleTail = currentOperation.catch(() => undefined);
|
|
536
|
+
return currentOperation;
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* @description Register a callback for unexpected server process exits.
|
|
540
|
+
* Called when the server crashes or is OOM-killed (e.g. exit code 137).
|
|
541
|
+
* NOT called when stopOpenCodeServer() is used.
|
|
542
|
+
*/
|
|
543
|
+
function onOpenCodeServerExit(callback) {
|
|
544
|
+
onServerExitCallback = callback;
|
|
545
|
+
}
|
|
546
|
+
async function checkIsOpenCodeServerRunning() {
|
|
547
|
+
return (await getOpenCodeServerHealth()).healthy;
|
|
548
|
+
}
|
|
549
|
+
/**
|
|
550
|
+
* @description Extract a bare semver (`1.17.11`; drops a leading `v`) from a
|
|
551
|
+
* version string — used for BOTH `opencode --version` output AND the
|
|
552
|
+
* `/global/health` `version` field, so the two comparison sides are normalized
|
|
553
|
+
* through the SAME rule. Without this, a future `v1.17.11` from one source vs
|
|
554
|
+
* `1.17.11` from the other would read as a false mismatch and churn the server
|
|
555
|
+
* once per boot. Returns null if no semver is present.
|
|
556
|
+
*/
|
|
557
|
+
function extractOpenCodeVersion(raw) {
|
|
558
|
+
if (!raw)
|
|
559
|
+
return null;
|
|
560
|
+
const match = raw.match(/\d+\.\d+\.\d+\S*/);
|
|
561
|
+
return match ? match[0] : null;
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* @description Probe /global/health for liveness AND the version the running
|
|
565
|
+
* server is actually executing. Detects a server still running an OLD binary
|
|
566
|
+
* after opencode was updated on disk: replacing the binary file does not change
|
|
567
|
+
* a live process (it keeps the old code in memory), and a newer opencode run
|
|
568
|
+
* can migrate the shared opencode.db underneath the old server — which then
|
|
569
|
+
* dies on every prompt (e.g. `no such column: replacement_seq`).
|
|
570
|
+
*/
|
|
571
|
+
async function getOpenCodeServerHealth() {
|
|
572
|
+
const url = process.env.OPENCODE_URL || exports.defaultOpenCodeUrl;
|
|
573
|
+
try {
|
|
574
|
+
const response = await fetch(`${url}/global/health`, { signal: AbortSignal.timeout(2000) });
|
|
575
|
+
if (!response.ok)
|
|
576
|
+
return { healthy: false, version: null };
|
|
577
|
+
const body = (await response.json().catch(() => null));
|
|
578
|
+
return { healthy: true, version: extractOpenCodeVersion(body?.version) };
|
|
579
|
+
}
|
|
580
|
+
catch {
|
|
581
|
+
return { healthy: false, version: null };
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
/** Cache so a boot-time reattach burst doesn't spawn `opencode --version` per call. */
|
|
585
|
+
let installedOpenCodeVersionCache = null;
|
|
586
|
+
const installedVersionCacheTtlMs = 10_000;
|
|
587
|
+
/**
|
|
588
|
+
* @description Version of the opencode binary currently on disk
|
|
589
|
+
* (`opencode --version`). Short-TTL cached to coalesce bursts. Returns null if
|
|
590
|
+
* it can't be determined — an unknown version never forces a restart.
|
|
591
|
+
*/
|
|
592
|
+
function getInstalledOpenCodeVersion() {
|
|
593
|
+
const now = Date.now();
|
|
594
|
+
if (installedOpenCodeVersionCache && now - installedOpenCodeVersionCache.at < installedVersionCacheTtlMs) {
|
|
595
|
+
return installedOpenCodeVersionCache.value;
|
|
596
|
+
}
|
|
597
|
+
let value = null;
|
|
598
|
+
try {
|
|
599
|
+
const out = (0, child_process_1.execFileSync)(getToolCommand('opencode'), ['--version'], {
|
|
600
|
+
encoding: 'utf8',
|
|
601
|
+
timeout: 5000,
|
|
602
|
+
env: { ...getOpenCodeChildEnv(), PATH: `${npmPrefix}/bin:${process.env.PATH}` },
|
|
603
|
+
});
|
|
604
|
+
value = extractOpenCodeVersion(out);
|
|
605
|
+
}
|
|
606
|
+
catch {
|
|
607
|
+
value = null;
|
|
608
|
+
}
|
|
609
|
+
installedOpenCodeVersionCache = { value, at: now };
|
|
610
|
+
return value;
|
|
611
|
+
}
|
|
612
|
+
/**
|
|
613
|
+
* @description Stale IFF BOTH versions are known AND differ. An unknown running
|
|
614
|
+
* or installed version is treated as "not stale" (adopt the server) so a
|
|
615
|
+
* transient probe failure never churns a working server.
|
|
616
|
+
*/
|
|
617
|
+
function checkIsOpenCodeServerStale(runningVersion, installedVersion) {
|
|
618
|
+
return !!runningVersion && !!installedVersion && runningVersion !== installedVersion;
|
|
619
|
+
}
|
|
620
|
+
/** Find the PID LISTENING on one endpoint (lsof, with an ss fallback). */
|
|
621
|
+
function getPidListeningOnEndpoint(hostname, port) {
|
|
622
|
+
const normalizedHostname = hostname.replace(/^\[|\]$/g, '');
|
|
623
|
+
const listenerAddresses = normalizedHostname === 'localhost'
|
|
624
|
+
? ['127.0.0.1', '::1']
|
|
625
|
+
: [normalizedHostname];
|
|
626
|
+
for (const listenerAddress of listenerAddresses) {
|
|
627
|
+
try {
|
|
628
|
+
const output = (0, child_process_1.execFileSync)('lsof', ['-nP', `-iTCP@${listenerAddress}:${port}`, '-sTCP:LISTEN', '-t'], { encoding: 'utf8', timeout: 3000 }).trim();
|
|
629
|
+
const pid = Number.parseInt(output.split('\n')[0], 10);
|
|
630
|
+
if (Number.isFinite(pid))
|
|
631
|
+
return pid;
|
|
632
|
+
}
|
|
633
|
+
catch {
|
|
634
|
+
// lsof missing / no match — try the next address, then ss
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
try {
|
|
638
|
+
const output = (0, child_process_1.execFileSync)('ss', ['-ltnpH', `sport = :${port}`], {
|
|
639
|
+
encoding: 'utf8',
|
|
640
|
+
timeout: 3000,
|
|
641
|
+
});
|
|
642
|
+
for (const line of output.split('\n')) {
|
|
643
|
+
const isExpectedAddress = listenerAddresses.some((listenerAddress) => line.includes(`${listenerAddress}:${port}`) ||
|
|
644
|
+
line.includes(`[${listenerAddress}]:${port}`));
|
|
645
|
+
if (!isExpectedAddress)
|
|
646
|
+
continue;
|
|
647
|
+
const match = line.match(/pid=(\d+)/);
|
|
648
|
+
if (match)
|
|
649
|
+
return Number.parseInt(match[1], 10);
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
catch {
|
|
653
|
+
// Caller refuses to replace a server it cannot identify safely.
|
|
654
|
+
}
|
|
655
|
+
return null;
|
|
656
|
+
}
|
|
657
|
+
/** Server stop: poll process identity every {@link staleServerKillPollMs};
|
|
658
|
+
* escalate to SIGKILL halfway and refuse replacement if it remains alive. */
|
|
659
|
+
const staleServerKillPollMs = 500;
|
|
660
|
+
const staleServerKillPollIterations = 16;
|
|
661
|
+
const staleServerSigkillAfterIterations = 8;
|
|
662
|
+
async function stopOpenCodeProcessOwnership(processOwnership, checkIsStillOwned) {
|
|
663
|
+
if (!checkIsStillOwned() ||
|
|
664
|
+
!signalProcessIdentity(processOwnership, 'SIGTERM', processOwnership.signalProcessGroup)) {
|
|
665
|
+
if (!checkIsProcessIdentityCurrent(processOwnership)) {
|
|
666
|
+
clearOwnedOpenCodeProcessOwnership(processOwnership);
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
throw new Error(`OpenCode server process ${processOwnership.pid} could not be stopped`);
|
|
670
|
+
}
|
|
671
|
+
for (let i = 0; i < staleServerKillPollIterations; i++) {
|
|
672
|
+
await (0, utils_1.sleep)(staleServerKillPollMs);
|
|
673
|
+
if (!checkIsProcessIdentityCurrent(processOwnership)) {
|
|
674
|
+
clearOwnedOpenCodeProcessOwnership(processOwnership);
|
|
675
|
+
return;
|
|
676
|
+
}
|
|
677
|
+
if (i === staleServerSigkillAfterIterations && checkIsStillOwned()) {
|
|
678
|
+
signalProcessIdentity(processOwnership, 'SIGKILL', processOwnership.signalProcessGroup);
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
throw new Error(`OpenCode server process ${processOwnership.pid} did not exit after SIGTERM and SIGKILL`);
|
|
682
|
+
}
|
|
683
|
+
/**
|
|
684
|
+
* @description Stop an OpenCode server that may have been ADOPTED at boot (so the
|
|
685
|
+
* bot holds no child handle for it). Every signal is guarded by the process
|
|
686
|
+
* start token captured for that PID, so PID reuse cannot target another process.
|
|
687
|
+
* Waits for the exact process to exit, escalating SIGTERM → SIGKILL.
|
|
688
|
+
*/
|
|
689
|
+
async function stopAdoptedOpenCodeServer(serverUrl) {
|
|
690
|
+
const endpoint = serverUrl.origin;
|
|
691
|
+
const port = getOpenCodePort(serverUrl);
|
|
692
|
+
const ownedProcessOwnership = getOwnedOpenCodeProcessOwnership(endpoint);
|
|
693
|
+
const listenerPid = ownedProcessOwnership
|
|
694
|
+
? null
|
|
695
|
+
: getPidListeningOnEndpoint(serverUrl.hostname, port);
|
|
696
|
+
const listenerIdentity = listenerPid ? getProcessIdentity(listenerPid) : null;
|
|
697
|
+
const processOwnership = ownedProcessOwnership ?? (listenerIdentity
|
|
698
|
+
? { ...listenerIdentity, endpoint, signalProcessGroup: false, state: 'ready' }
|
|
699
|
+
: null);
|
|
700
|
+
if (!processOwnership) {
|
|
701
|
+
if (await checkIsOpenCodeServerRunning()) {
|
|
702
|
+
throw new Error(`OpenCode server on port ${port} is healthy but its process could not be identified`);
|
|
703
|
+
}
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
706
|
+
if (openCodeProcess?.pid === processOwnership.pid) {
|
|
707
|
+
intentionallyStoppedProcesses.add(openCodeProcess);
|
|
708
|
+
}
|
|
709
|
+
await stopOpenCodeProcessOwnership(processOwnership, () => checkIsOpenCodeProcessOwnershipCurrent(processOwnership));
|
|
710
|
+
}
|
|
711
|
+
/**
|
|
712
|
+
* @description Start opencode serve as a background process. A normal bot owns
|
|
713
|
+
* the child directly; a replaceable hot worker uses a one-shot host so every
|
|
714
|
+
* replacement generation is reparented outside nodemon's kill tree.
|
|
715
|
+
* Waits until server responds to health check (up to 15s).
|
|
716
|
+
*
|
|
717
|
+
* If a server is already up but running an OUTDATED binary (version reported by
|
|
718
|
+
* /global/health differs from the on-disk `opencode --version`), it is restarted
|
|
719
|
+
* onto the current binary instead of being adopted — otherwise a stale server
|
|
720
|
+
* lingers across bot restarts (boot would adopt it on a bare liveness check) and
|
|
721
|
+
* keeps failing prompts after an opencode update.
|
|
722
|
+
*/
|
|
723
|
+
async function ensureOpenCodeServerUnlocked() {
|
|
724
|
+
const serverUrl = new URL(process.env.OPENCODE_URL || exports.defaultOpenCodeUrl);
|
|
725
|
+
const port = getOpenCodePort(serverUrl);
|
|
726
|
+
const endpoint = serverUrl.origin;
|
|
727
|
+
const health = await getOpenCodeServerHealth();
|
|
728
|
+
if (health.healthy) {
|
|
729
|
+
const installedVersion = getInstalledOpenCodeVersion();
|
|
730
|
+
if (checkIsOpenCodeServerStale(health.version, installedVersion)) {
|
|
731
|
+
console.log(`[OpenCode] Adopted server is stale (running v${health.version}, on-disk v${installedVersion}) — restarting onto current binary`);
|
|
732
|
+
await stopAdoptedOpenCodeServer(serverUrl);
|
|
733
|
+
// fall through to spawn a fresh server on the current binary
|
|
734
|
+
}
|
|
735
|
+
else {
|
|
736
|
+
saveHealthyOpenCodeServerOwnership(endpoint, serverUrl.hostname, port);
|
|
737
|
+
return; // healthy and current (or version unknown) → adopt as-is
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
else if (checkHasOwnedOpenCodeProcess(endpoint)) {
|
|
741
|
+
// A persisted identity lets a fresh hot worker recover the supervisor's
|
|
742
|
+
// initial server or a replacement started by an earlier worker generation.
|
|
743
|
+
await stopAdoptedOpenCodeServer(serverUrl);
|
|
744
|
+
}
|
|
745
|
+
const opencodeCmd = getToolCommand('opencode');
|
|
746
|
+
console.log(`[OpenCode] Starting server on port ${port}... (${opencodeCmd})`);
|
|
747
|
+
const serverArgs = ['serve', '--hostname', '127.0.0.1', '--port', port];
|
|
748
|
+
const serverEnv = {
|
|
749
|
+
...getOpenCodeChildEnv(),
|
|
750
|
+
PATH: `${npmPrefix}/bin:${process.env.PATH}`,
|
|
751
|
+
// Enable OpenCode's background-subagents (experimental in 1.17.11): lets the
|
|
752
|
+
// bot detach a synchronous sub-agent that is blocking a session via
|
|
753
|
+
// `POST /experimental/session/:id/background` so a new message can be
|
|
754
|
+
// answered while the sub-agent keeps running (its result is auto-injected
|
|
755
|
+
// back when it finishes). Without this the whole session is locked for the
|
|
756
|
+
// entire sub-agent run and the topic looks hung.
|
|
757
|
+
OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS: 'true',
|
|
758
|
+
};
|
|
759
|
+
// The bot's compaction plugin, so an overflow compaction (which never gets the
|
|
760
|
+
// bot's per-invocation instruction) still names the loaded skills. Installed
|
|
761
|
+
// before the spawn so the new server's first folder instance already loads it.
|
|
762
|
+
(0, openCodeCompactPlugin_1.installOpenCodeCompactPlugin)();
|
|
763
|
+
let startupChild = null;
|
|
764
|
+
let startupHostedProcess = null;
|
|
765
|
+
let startupDirectProcessOwnership = null;
|
|
766
|
+
let startupError = null;
|
|
767
|
+
let hasServerBecomeReady = false;
|
|
768
|
+
const checkIsStartupProcessRunning = () => {
|
|
769
|
+
if (startupChild && (startupError !== null || startupChild.exitCode !== null)) {
|
|
770
|
+
return false;
|
|
771
|
+
}
|
|
772
|
+
const startupProcessOwnership = startupDirectProcessOwnership ?? startupHostedProcess;
|
|
773
|
+
return !startupProcessOwnership || checkIsProcessIdentityCurrent(startupProcessOwnership);
|
|
774
|
+
};
|
|
775
|
+
if (process.env[exports.openCodeExternalHostEnvName] === exports.openCodeExternalHostEnvValue) {
|
|
776
|
+
const hostedProcessIdentity = await startExternallyParentedProcess(opencodeCmd, serverArgs, serverEnv, {
|
|
777
|
+
prepareProcessIdentity: (processIdentity) => {
|
|
778
|
+
saveOpenCodeServerProcessOwnership({
|
|
779
|
+
...processIdentity,
|
|
780
|
+
endpoint,
|
|
781
|
+
signalProcessGroup: true,
|
|
782
|
+
state: 'starting',
|
|
783
|
+
});
|
|
784
|
+
},
|
|
785
|
+
});
|
|
786
|
+
startupHostedProcess = {
|
|
787
|
+
...hostedProcessIdentity,
|
|
788
|
+
endpoint,
|
|
789
|
+
signalProcessGroup: true,
|
|
790
|
+
state: 'starting',
|
|
791
|
+
};
|
|
792
|
+
ownedOpenCodeProcess = startupHostedProcess;
|
|
793
|
+
openCodeProcess = null;
|
|
794
|
+
console.log(`[OpenCode] Server process ${startupHostedProcess.pid} is hosted outside the hot worker tree`);
|
|
795
|
+
}
|
|
796
|
+
else {
|
|
797
|
+
const child = (0, child_process_1.spawn)(opencodeCmd, serverArgs, {
|
|
798
|
+
env: serverEnv,
|
|
799
|
+
detached: process.platform !== 'win32',
|
|
800
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
801
|
+
});
|
|
802
|
+
startupChild = child;
|
|
803
|
+
const directProcessIdentity = child.pid ? getProcessIdentity(child.pid) : null;
|
|
804
|
+
startupDirectProcessOwnership = directProcessIdentity
|
|
805
|
+
? { ...directProcessIdentity, endpoint, signalProcessGroup: true, state: 'starting' }
|
|
806
|
+
: null;
|
|
807
|
+
openCodeProcess = child;
|
|
808
|
+
ownedOpenCodeProcess = startupDirectProcessOwnership;
|
|
809
|
+
child.stdout?.on('data', (data) => {
|
|
810
|
+
console.log(`[OpenCode Server] ${data.toString().trim()}`);
|
|
811
|
+
});
|
|
812
|
+
child.stderr?.on('data', (data) => {
|
|
813
|
+
console.error(`[OpenCode Server] ${data.toString().trim()}`);
|
|
814
|
+
});
|
|
815
|
+
child.once('error', (error) => {
|
|
816
|
+
startupError = error;
|
|
817
|
+
});
|
|
818
|
+
child.on('exit', (code, signal) => {
|
|
819
|
+
console.log(`[OpenCode Server] Process exited with code ${code}, signal ${signal}`);
|
|
820
|
+
if (openCodeProcess === child) {
|
|
821
|
+
openCodeProcess = null;
|
|
822
|
+
}
|
|
823
|
+
if (!intentionallyStoppedProcesses.has(child) &&
|
|
824
|
+
!relinquishedProcesses.has(child) &&
|
|
825
|
+
hasServerBecomeReady &&
|
|
826
|
+
onServerExitCallback) {
|
|
827
|
+
onServerExitCallback(code, signal);
|
|
828
|
+
}
|
|
829
|
+
if (startupDirectProcessOwnership) {
|
|
830
|
+
clearOwnedOpenCodeProcessOwnership(startupDirectProcessOwnership);
|
|
831
|
+
}
|
|
832
|
+
});
|
|
833
|
+
if (process.env[exports.openCodeOwnershipFileEnvName]) {
|
|
834
|
+
if (!startupDirectProcessOwnership) {
|
|
835
|
+
intentionallyStoppedProcesses.add(child);
|
|
836
|
+
child.kill('SIGKILL');
|
|
837
|
+
throw new Error('OpenCode server process identity could not be captured');
|
|
838
|
+
}
|
|
839
|
+
const directProcessOwnership = startupDirectProcessOwnership;
|
|
840
|
+
try {
|
|
841
|
+
saveOpenCodeServerProcessOwnership(directProcessOwnership);
|
|
842
|
+
}
|
|
843
|
+
catch (error) {
|
|
844
|
+
intentionallyStoppedProcesses.add(child);
|
|
845
|
+
await stopOpenCodeProcessOwnership(directProcessOwnership, () => checkIsProcessIdentityCurrent(directProcessOwnership));
|
|
846
|
+
throw error;
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
try {
|
|
851
|
+
// Wait for server to become ready
|
|
852
|
+
const healthUrl = `${process.env.OPENCODE_URL || exports.defaultOpenCodeUrl}/global/health`;
|
|
853
|
+
for (let i = 0; i < 15; i++) {
|
|
854
|
+
await (0, utils_1.sleep)(1000);
|
|
855
|
+
try {
|
|
856
|
+
const response = await fetch(healthUrl, { signal: AbortSignal.timeout(2000) });
|
|
857
|
+
if (response.ok) {
|
|
858
|
+
if (!checkIsStartupProcessRunning()) {
|
|
859
|
+
throw startupError ?? new Error('OpenCode server failed during readiness');
|
|
860
|
+
}
|
|
861
|
+
const startupProcessOwnership = startupDirectProcessOwnership ?? startupHostedProcess;
|
|
862
|
+
if (startupProcessOwnership) {
|
|
863
|
+
const readyProcessOwnership = {
|
|
864
|
+
...startupProcessOwnership,
|
|
865
|
+
state: 'ready',
|
|
866
|
+
};
|
|
867
|
+
saveOpenCodeServerProcessOwnership(readyProcessOwnership);
|
|
868
|
+
if (!checkIsStartupProcessRunning()) {
|
|
869
|
+
throw startupError ?? new Error('OpenCode server failed during readiness');
|
|
870
|
+
}
|
|
871
|
+
ownedOpenCodeProcess = readyProcessOwnership;
|
|
872
|
+
}
|
|
873
|
+
hasServerBecomeReady = true;
|
|
874
|
+
console.log(`[OpenCode] Server ready`);
|
|
875
|
+
return;
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
catch {
|
|
879
|
+
// not ready yet
|
|
880
|
+
}
|
|
881
|
+
if (!checkIsStartupProcessRunning()) {
|
|
882
|
+
throw startupError ?? new Error('OpenCode server failed to start');
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
throw new Error('OpenCode server did not become ready within 15 seconds');
|
|
886
|
+
}
|
|
887
|
+
catch (error) {
|
|
888
|
+
const doesOwnFailedStartup = startupChild
|
|
889
|
+
? openCodeProcess === startupChild
|
|
890
|
+
: ownedOpenCodeProcess === startupHostedProcess;
|
|
891
|
+
const failedStartupOwnership = startupDirectProcessOwnership ?? startupHostedProcess;
|
|
892
|
+
if (doesOwnFailedStartup && failedStartupOwnership) {
|
|
893
|
+
await stopOpenCodeProcessOwnership(failedStartupOwnership, () => checkIsProcessIdentityCurrent(failedStartupOwnership));
|
|
894
|
+
}
|
|
895
|
+
throw error;
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
function ensureOpenCodeServer() {
|
|
899
|
+
return runOpenCodeServerLifecycle(ensureOpenCodeServerUnlocked);
|
|
900
|
+
}
|
|
901
|
+
/**
|
|
902
|
+
* @description Force the current OpenCode server generation to stop and start
|
|
903
|
+
* again. Unlike {@link ensureOpenCodeServer}, this NEVER adopts a healthy
|
|
904
|
+
* process: provider OAuth performed by `opencode auth login` writes auth.json
|
|
905
|
+
* out-of-band, while a live server keeps the old credential in memory. The
|
|
906
|
+
* caller owns restoring active sessions after this controlled restart.
|
|
907
|
+
*/
|
|
908
|
+
function restartOpenCodeServer() {
|
|
909
|
+
return runOpenCodeServerLifecycle(async () => {
|
|
910
|
+
const serverUrl = new URL(process.env.OPENCODE_URL || exports.defaultOpenCodeUrl);
|
|
911
|
+
await stopAdoptedOpenCodeServer(serverUrl);
|
|
912
|
+
await ensureOpenCodeServerUnlocked();
|
|
913
|
+
});
|
|
914
|
+
}
|
|
915
|
+
function stopOpenCodeServer() {
|
|
916
|
+
const child = openCodeProcess;
|
|
917
|
+
const endpoint = new URL(process.env.OPENCODE_URL || exports.defaultOpenCodeUrl).origin;
|
|
918
|
+
const inMemoryOwnership = ownedOpenCodeProcess;
|
|
919
|
+
const directlyOwnedProcess = child && inMemoryOwnership &&
|
|
920
|
+
inMemoryOwnership.pid === child.pid &&
|
|
921
|
+
inMemoryOwnership.endpoint === endpoint &&
|
|
922
|
+
checkIsProcessIdentityCurrent(inMemoryOwnership)
|
|
923
|
+
? inMemoryOwnership
|
|
924
|
+
: null;
|
|
925
|
+
const processOwnership = directlyOwnedProcess ?? getOwnedOpenCodeProcessOwnership(endpoint);
|
|
926
|
+
if (child) {
|
|
927
|
+
intentionallyStoppedProcesses.add(child);
|
|
928
|
+
}
|
|
929
|
+
if (processOwnership) {
|
|
930
|
+
console.log(`[OpenCode] Stopping server process ${processOwnership.pid}...`);
|
|
931
|
+
if (directlyOwnedProcess ||
|
|
932
|
+
checkIsOpenCodeProcessOwnershipCurrent(processOwnership)) {
|
|
933
|
+
signalProcessIdentity(processOwnership, 'SIGTERM', processOwnership.signalProcessGroup);
|
|
934
|
+
}
|
|
935
|
+
if (!checkIsProcessIdentityCurrent(processOwnership)) {
|
|
936
|
+
clearOwnedOpenCodeProcessOwnership(processOwnership);
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
else if (child && !child.killed) {
|
|
940
|
+
child.kill('SIGTERM');
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
//# sourceMappingURL=installManager.js.map
|