charness 3.0.0 → 3.2.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 +8 -7
- package/DEVELOPMENT.md +12 -6
- package/MIGRATION_1_TO_2.md +1 -1
- package/MIGRATION_RENAME_TO_CHARNESS.md +133 -0
- package/README.md +221 -555
- package/SETUP.md +539 -0
- package/dist/adapters/claudeCliAdapter.d.ts +16 -1
- package/dist/adapters/claudeCliAdapter.d.ts.map +1 -1
- package/dist/adapters/claudeCliAdapter.js +37 -2
- package/dist/adapters/claudeCliAdapter.js.map +1 -1
- package/dist/adapters/claudeConfigDir.d.ts +40 -0
- package/dist/adapters/claudeConfigDir.d.ts.map +1 -0
- package/dist/adapters/claudeConfigDir.js +3 -0
- package/dist/adapters/claudeConfigDir.js.map +1 -0
- package/dist/adapters/claudeJsonStreamAdapter.d.ts +32 -0
- package/dist/adapters/claudeJsonStreamAdapter.d.ts.map +1 -1
- package/dist/adapters/claudeJsonStreamAdapter.js +90 -8
- package/dist/adapters/claudeJsonStreamAdapter.js.map +1 -1
- package/dist/adapters/claudePlatformFlags.d.ts +4 -4
- package/dist/adapters/claudePlatformFlags.js +4 -4
- package/dist/adapters/createAdapter.d.ts +8 -0
- package/dist/adapters/createAdapter.d.ts.map +1 -1
- package/dist/adapters/createAdapter.js +37 -0
- package/dist/adapters/createAdapter.js.map +1 -1
- package/dist/adapters/openCodeAdapter.d.ts +23 -0
- package/dist/adapters/openCodeAdapter.d.ts.map +1 -1
- package/dist/adapters/openCodeAdapter.js +85 -2
- package/dist/adapters/openCodeAdapter.js.map +1 -1
- package/dist/agentLogin/agentLogin.d.ts +15 -2
- package/dist/agentLogin/agentLogin.d.ts.map +1 -1
- package/dist/agentLogin/agentLogin.js +53 -16
- package/dist/agentLogin/agentLogin.js.map +1 -1
- package/dist/apiErrorRetry.d.ts +8 -3
- package/dist/apiErrorRetry.d.ts.map +1 -1
- package/dist/apiErrorRetry.js +36 -5
- package/dist/apiErrorRetry.js.map +1 -1
- package/dist/apiRetryKick.d.ts +9 -0
- package/dist/apiRetryKick.d.ts.map +1 -1
- package/dist/apiRetryKick.js +16 -0
- package/dist/apiRetryKick.js.map +1 -1
- package/dist/bot.d.ts.map +1 -1
- package/dist/bot.js +642 -26
- package/dist/bot.js.map +1 -1
- package/dist/cli/bot.d.ts +4 -2
- package/dist/cli/bot.d.ts.map +1 -1
- package/dist/cli/bot.js +11 -3
- package/dist/cli/bot.js.map +1 -1
- package/dist/cli/botEntry.js +3 -1
- package/dist/cli/botEntry.js.map +1 -1
- package/dist/cli/claudeProfiles.d.ts +42 -0
- package/dist/cli/claudeProfiles.d.ts.map +1 -0
- package/dist/cli/claudeProfiles.js +106 -0
- package/dist/cli/claudeProfiles.js.map +1 -0
- package/dist/cli/envLoader.d.ts +6 -5
- package/dist/cli/envLoader.d.ts.map +1 -1
- package/dist/cli/envLoader.js +8 -27
- package/dist/cli/envLoader.js.map +1 -1
- package/dist/cli/hot.d.ts +2 -2
- package/dist/cli/hot.d.ts.map +1 -1
- package/dist/cli/hot.js +26 -16
- package/dist/cli/hot.js.map +1 -1
- package/dist/cli.js +19 -9
- package/dist/cli.js.map +1 -1
- package/dist/connectors/jira/adf.d.ts +23 -0
- package/dist/connectors/jira/adf.d.ts.map +1 -1
- package/dist/connectors/jira/adf.js +44 -0
- package/dist/connectors/jira/adf.js.map +1 -1
- package/dist/connectors/jira/answerSink.d.ts +27 -3
- package/dist/connectors/jira/answerSink.d.ts.map +1 -1
- package/dist/connectors/jira/answerSink.js +145 -18
- package/dist/connectors/jira/answerSink.js.map +1 -1
- package/dist/connectors/jira/attachmentTool.d.ts +7 -0
- package/dist/connectors/jira/attachmentTool.d.ts.map +1 -1
- package/dist/connectors/jira/attachmentTool.js +16 -0
- package/dist/connectors/jira/attachmentTool.js.map +1 -1
- package/dist/connectors/jira/client.d.ts +36 -0
- package/dist/connectors/jira/client.d.ts.map +1 -1
- package/dist/connectors/jira/client.js +46 -5
- package/dist/connectors/jira/client.js.map +1 -1
- package/dist/connectors/jira/config.d.ts +13 -17
- package/dist/connectors/jira/config.d.ts.map +1 -1
- package/dist/connectors/jira/config.js +15 -33
- package/dist/connectors/jira/config.js.map +1 -1
- package/dist/connectors/jira/connector.d.ts +10 -1
- package/dist/connectors/jira/connector.d.ts.map +1 -1
- package/dist/connectors/jira/connector.js +90 -16
- package/dist/connectors/jira/connector.js.map +1 -1
- package/dist/connectors/jira/contextLedger.d.ts +7 -0
- package/dist/connectors/jira/contextLedger.d.ts.map +1 -1
- package/dist/connectors/jira/contextLedger.js +18 -0
- package/dist/connectors/jira/contextLedger.js.map +1 -1
- package/dist/connectors/jira/contextPreamble.d.ts.map +1 -1
- package/dist/connectors/jira/contextPreamble.js +6 -3
- package/dist/connectors/jira/contextPreamble.js.map +1 -1
- package/dist/connectors/jira/inbound.d.ts +72 -10
- package/dist/connectors/jira/inbound.d.ts.map +1 -1
- package/dist/connectors/jira/inbound.js +204 -36
- package/dist/connectors/jira/inbound.js.map +1 -1
- package/dist/connectors/jira/issueBlocks.d.ts +31 -3
- package/dist/connectors/jira/issueBlocks.d.ts.map +1 -1
- package/dist/connectors/jira/issueBlocks.js +108 -29
- package/dist/connectors/jira/issueBlocks.js.map +1 -1
- package/dist/connectors/jira/issueContext.d.ts +11 -5
- package/dist/connectors/jira/issueContext.d.ts.map +1 -1
- package/dist/connectors/jira/issueContext.js +23 -6
- package/dist/connectors/jira/issueContext.js.map +1 -1
- package/dist/connectors/jira/issueDelta.d.ts +3 -0
- package/dist/connectors/jira/issueDelta.d.ts.map +1 -1
- package/dist/connectors/jira/issueDelta.js +15 -6
- package/dist/connectors/jira/issueDelta.js.map +1 -1
- package/dist/connectors/jira/mediaPlaceholders.d.ts +2 -0
- package/dist/connectors/jira/mediaPlaceholders.d.ts.map +1 -1
- package/dist/connectors/jira/mediaPlaceholders.js +16 -3
- package/dist/connectors/jira/mediaPlaceholders.js.map +1 -1
- package/dist/connectors/jira/prompt.d.ts +4 -0
- package/dist/connectors/jira/prompt.d.ts.map +1 -1
- package/dist/connectors/jira/prompt.js +20 -1
- package/dist/connectors/jira/prompt.js.map +1 -1
- package/dist/connectors/jira/sessionKeyCodec.d.ts +2 -0
- package/dist/connectors/jira/sessionKeyCodec.d.ts.map +1 -1
- package/dist/connectors/jira/sessionKeyCodec.js +5 -0
- package/dist/connectors/jira/sessionKeyCodec.js.map +1 -1
- package/dist/connectors/jira/trigger.d.ts +16 -3
- package/dist/connectors/jira/trigger.d.ts.map +1 -1
- package/dist/connectors/jira/trigger.js +17 -2
- package/dist/connectors/jira/trigger.js.map +1 -1
- package/dist/connectors/jira/triggerLog.d.ts +12 -3
- package/dist/connectors/jira/triggerLog.d.ts.map +1 -1
- package/dist/connectors/jira/triggerLog.js +18 -2
- package/dist/connectors/jira/triggerLog.js.map +1 -1
- package/dist/connectors/jira/trustedGroup.d.ts +54 -0
- package/dist/connectors/jira/trustedGroup.d.ts.map +1 -0
- package/dist/connectors/jira/trustedGroup.js +98 -0
- package/dist/connectors/jira/trustedGroup.js.map +1 -0
- package/dist/connectors/telegram/commands/autoContinueLimits.d.ts +3 -0
- package/dist/connectors/telegram/commands/autoContinueLimits.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/autoContinueLimits.js +15 -45
- package/dist/connectors/telegram/commands/autoContinueLimits.js.map +1 -1
- package/dist/connectors/telegram/commands/claudeAccounts.d.ts +58 -0
- package/dist/connectors/telegram/commands/claudeAccounts.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/claudeAccounts.js +591 -0
- package/dist/connectors/telegram/commands/claudeAccounts.js.map +1 -0
- package/dist/connectors/telegram/commands/fallbackChain.d.ts +49 -0
- package/dist/connectors/telegram/commands/fallbackChain.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/fallbackChain.js +624 -0
- package/dist/connectors/telegram/commands/fallbackChain.js.map +1 -0
- package/dist/connectors/telegram/commands/modelProviders.d.ts +23 -1
- package/dist/connectors/telegram/commands/modelProviders.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/modelProviders.js +131 -6
- package/dist/connectors/telegram/commands/modelProviders.js.map +1 -1
- package/dist/i18n/de.d.ts.map +1 -1
- package/dist/i18n/de.js +137 -9
- package/dist/i18n/de.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +137 -9
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/es.d.ts.map +1 -1
- package/dist/i18n/es.js +137 -9
- package/dist/i18n/es.js.map +1 -1
- package/dist/i18n/fr.d.ts.map +1 -1
- package/dist/i18n/fr.js +137 -9
- package/dist/i18n/fr.js.map +1 -1
- package/dist/i18n/hi.d.ts.map +1 -1
- package/dist/i18n/hi.js +137 -9
- package/dist/i18n/hi.js.map +1 -1
- package/dist/i18n/ja.d.ts.map +1 -1
- package/dist/i18n/ja.js +137 -9
- package/dist/i18n/ja.js.map +1 -1
- package/dist/i18n/ka.d.ts.map +1 -1
- package/dist/i18n/ka.js +137 -9
- package/dist/i18n/ka.js.map +1 -1
- package/dist/i18n/pt.d.ts.map +1 -1
- package/dist/i18n/pt.js +137 -9
- package/dist/i18n/pt.js.map +1 -1
- package/dist/i18n/ru.d.ts.map +1 -1
- package/dist/i18n/ru.js +137 -9
- package/dist/i18n/ru.js.map +1 -1
- package/dist/i18n/uk.d.ts.map +1 -1
- package/dist/i18n/uk.js +137 -9
- package/dist/i18n/uk.js.map +1 -1
- package/dist/i18n/uz.d.ts.map +1 -1
- package/dist/i18n/uz.js +137 -9
- package/dist/i18n/uz.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +137 -9
- package/dist/i18n/zh.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/installManager.d.ts +16 -2
- package/dist/installManager.d.ts.map +1 -1
- package/dist/installManager.js +42 -12
- package/dist/installManager.js.map +1 -1
- package/dist/instanceLock.d.ts.map +1 -1
- package/dist/instanceLock.js +10 -8
- package/dist/instanceLock.js.map +1 -1
- package/dist/legacyMigration.d.ts +69 -0
- package/dist/legacyMigration.d.ts.map +1 -0
- package/dist/legacyMigration.js +338 -0
- package/dist/legacyMigration.js.map +1 -0
- package/dist/legacyNames.d.ts +107 -0
- package/dist/legacyNames.d.ts.map +1 -0
- package/dist/legacyNames.js +230 -0
- package/dist/legacyNames.js.map +1 -0
- package/dist/platform/answerSink.d.ts +5 -0
- package/dist/platform/answerSink.d.ts.map +1 -1
- package/dist/platform/answerSink.js.map +1 -1
- package/dist/requests/answerRequest.d.ts +2 -0
- package/dist/requests/answerRequest.d.ts.map +1 -1
- package/dist/requests/answerRequest.js +3 -1
- package/dist/requests/answerRequest.js.map +1 -1
- package/dist/requests/answerStyle.d.ts +11 -0
- package/dist/requests/answerStyle.d.ts.map +1 -0
- package/dist/requests/answerStyle.js +14 -0
- package/dist/requests/answerStyle.js.map +1 -0
- package/dist/requests/answerTail.d.ts.map +1 -1
- package/dist/requests/answerTail.js +2 -0
- package/dist/requests/answerTail.js.map +1 -1
- package/dist/requests/requestHeader.d.ts.map +1 -1
- package/dist/requests/requestHeader.js +3 -0
- package/dist/requests/requestHeader.js.map +1 -1
- package/dist/requests/requestLedger.js +1 -1
- package/dist/requests/requestLedger.js.map +1 -1
- package/dist/requests/types.d.ts +3 -1
- package/dist/requests/types.d.ts.map +1 -1
- package/dist/scheduler/mcpSurface.d.ts +17 -1
- package/dist/scheduler/mcpSurface.d.ts.map +1 -1
- package/dist/scheduler/mcpSurface.js +86 -13
- package/dist/scheduler/mcpSurface.js.map +1 -1
- package/dist/state.d.ts +175 -2
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +303 -2
- package/dist/state.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/autoContinueOnLimit.d.ts +7 -0
- package/dist/utils/autoContinueOnLimit.d.ts.map +1 -1
- package/dist/utils/autoContinueOnLimit.js +10 -0
- package/dist/utils/autoContinueOnLimit.js.map +1 -1
- package/dist/utils/claudeAccountPickerPlan.d.ts +85 -0
- package/dist/utils/claudeAccountPickerPlan.d.ts.map +1 -0
- package/dist/utils/claudeAccountPickerPlan.js +123 -0
- package/dist/utils/claudeAccountPickerPlan.js.map +1 -0
- package/dist/utils/claudeLimitSwitch.d.ts +40 -0
- package/dist/utils/claudeLimitSwitch.d.ts.map +1 -0
- package/dist/utils/claudeLimitSwitch.js +54 -0
- package/dist/utils/claudeLimitSwitch.js.map +1 -0
- package/dist/utils/claudeProfileUsageLines.d.ts +15 -0
- package/dist/utils/claudeProfileUsageLines.d.ts.map +1 -0
- package/dist/utils/claudeProfileUsageLines.js +42 -0
- package/dist/utils/claudeProfileUsageLines.js.map +1 -0
- package/dist/utils/claudeProfiles.d.ts +124 -0
- package/dist/utils/claudeProfiles.d.ts.map +1 -0
- package/dist/utils/claudeProfiles.js +304 -0
- package/dist/utils/claudeProfiles.js.map +1 -0
- package/dist/utils/claudeStreamJson.d.ts +13 -1
- package/dist/utils/claudeStreamJson.d.ts.map +1 -1
- package/dist/utils/claudeStreamJson.js +13 -0
- package/dist/utils/claudeStreamJson.js.map +1 -1
- package/dist/utils/claudeUsage.d.ts +209 -0
- package/dist/utils/claudeUsage.d.ts.map +1 -0
- package/dist/utils/claudeUsage.js +413 -0
- package/dist/utils/claudeUsage.js.map +1 -0
- package/dist/utils/claudeUsageRefresher.d.ts +44 -0
- package/dist/utils/claudeUsageRefresher.d.ts.map +1 -0
- package/dist/utils/claudeUsageRefresher.js +95 -0
- package/dist/utils/claudeUsageRefresher.js.map +1 -0
- package/dist/utils/fallbackBridge.d.ts +32 -0
- package/dist/utils/fallbackBridge.d.ts.map +1 -0
- package/dist/utils/fallbackBridge.js +62 -0
- package/dist/utils/fallbackBridge.js.map +1 -0
- package/dist/utils/fallbackChain.d.ts +299 -0
- package/dist/utils/fallbackChain.d.ts.map +1 -0
- package/dist/utils/fallbackChain.js +542 -0
- package/dist/utils/fallbackChain.js.map +1 -0
- package/dist/utils/jsonStreamHost.d.ts +14 -3
- package/dist/utils/jsonStreamHost.d.ts.map +1 -1
- package/dist/utils/jsonStreamHost.js +26 -5
- package/dist/utils/jsonStreamHost.js.map +1 -1
- package/dist/utils/modelRecentPlan.d.ts +56 -0
- package/dist/utils/modelRecentPlan.d.ts.map +1 -0
- package/dist/utils/modelRecentPlan.js +107 -0
- package/dist/utils/modelRecentPlan.js.map +1 -0
- package/dist/utils/openCodeCompactPlugin.d.ts +11 -3
- package/dist/utils/openCodeCompactPlugin.d.ts.map +1 -1
- package/dist/utils/openCodeCompactPlugin.js +37 -5
- package/dist/utils/openCodeCompactPlugin.js.map +1 -1
- package/dist/utils/threadStatusReport.d.ts +25 -1
- package/dist/utils/threadStatusReport.d.ts.map +1 -1
- package/dist/utils/threadStatusReport.js +24 -1
- package/dist/utils/threadStatusReport.js.map +1 -1
- package/examples/.env.example +7 -7
- package/examples/docker-compose.yml +15 -14
- package/package.json +3 -1
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @description The FALLBACK CHAIN (`/limits`, formerly `/fallback`): one instance-wide, ordered list of «where a topic's main agent
|
|
4
|
+
* continues when its own account / provider hits a usage limit». An entry names a backend and what it runs on —
|
|
5
|
+
* a Claude account profile (`utils/claudeProfiles.ts`) with an optional model, or an OpenCode provider with a
|
|
6
|
+
* model — and the list is the operator's PRIORITY (top = preferred). The bot drafts it from what is actually
|
|
7
|
+
* signed in (`proposeFallbackChain`), the operator reorders / removes / adds with buttons, and a limit on a
|
|
8
|
+
* topic picks the first AVAILABLE entry (`pickFallbackCandidates`): not disabled, signed in, present in the live catalog,
|
|
9
|
+
* not marked limited, and not the account the topic is already on.
|
|
10
|
+
*
|
|
11
|
+
* This module is the pure layer: the chain shape, its edit operations, the draft, the ranking, the
|
|
12
|
+
* auto / offer / none decision and the `callback_data` codecs. The chain lives in `state.json`
|
|
13
|
+
* (`StateStore.getFallbackChain`), the detection and the switch itself in `bot.ts`, the `/limits` screen in
|
|
14
|
+
* `connectors/telegram/commands/fallbackChain.ts`. The within-Claude ranking by headroom
|
|
15
|
+
* (`claudeLimitSwitch.ts`) is what an EMPTY chain falls back to, so a bot without a configured chain behaves
|
|
16
|
+
* exactly as before.
|
|
17
|
+
*
|
|
18
|
+
* No I/O, no `Date.now()`: the caller passes the clock and the detection views, so every rule is unit-tested.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.fallbackWaitOpenCallback = exports.fallbackAutoSwitchOpenCallback = exports.fallbackWaitSameCallback = exports.fallbackWaitOffCallback = exports.fallbackWaitOnCallback = exports.fallbackAutoSwitchSameCallback = exports.fallbackAutoSwitchOffCallback = exports.fallbackAutoSwitchOnCallback = exports.fallbackBackCallback = exports.fallbackClearCallback = exports.fallbackProposeConfirmCallback = exports.fallbackProposeCallback = exports.fallbackAddModelCallbackRe = exports.fallbackAddModelPageCallbackRe = exports.fallbackAddProviderCallbackRe = exports.fallbackAddClaudeModelCallbackRe = exports.fallbackAddClaudeCallbackRe = exports.fallbackAddCallback = exports.fallbackOpenCallbackRe = exports.fallbackToggleCallbackRe = exports.fallbackRemoveCallbackRe = exports.fallbackMoveDownCallbackRe = exports.fallbackMoveUpCallbackRe = exports.fallbackSwitchCallbackRe = exports.fallbackSwitchCallbackPrefix = exports.fallbackEarliestResetToleranceMs = exports.fallbackClaudeModelAliases = exports.fallbackSwitchMaxOffers = exports.fallbackChainMaxLength = void 0;
|
|
22
|
+
exports.parseOpenCodeModelLabel = parseOpenCodeModelLabel;
|
|
23
|
+
exports.buildOpenCodeModelLabel = buildOpenCodeModelLabel;
|
|
24
|
+
exports.checkIsSameFallbackEntry = checkIsSameFallbackEntry;
|
|
25
|
+
exports.checkIsSameFallbackAccount = checkIsSameFallbackAccount;
|
|
26
|
+
exports.formatFallbackEntryKey = formatFallbackEntryKey;
|
|
27
|
+
exports.formatFallbackEntryLabel = formatFallbackEntryLabel;
|
|
28
|
+
exports.normaliseFallbackChain = normaliseFallbackChain;
|
|
29
|
+
exports.checkIsFallbackEntryDisabled = checkIsFallbackEntryDisabled;
|
|
30
|
+
exports.toggleFallbackEntryDisabled = toggleFallbackEntryDisabled;
|
|
31
|
+
exports.addFallbackEntry = addFallbackEntry;
|
|
32
|
+
exports.removeFallbackEntry = removeFallbackEntry;
|
|
33
|
+
exports.moveFallbackEntry = moveFallbackEntry;
|
|
34
|
+
exports.getFallbackChainRevision = getFallbackChainRevision;
|
|
35
|
+
exports.listOpenCodeProviders = listOpenCodeProviders;
|
|
36
|
+
exports.listOpenCodeModelsOfProvider = listOpenCodeModelsOfProvider;
|
|
37
|
+
exports.pickPreferredOpenCodeModel = pickPreferredOpenCodeModel;
|
|
38
|
+
exports.proposeFallbackChain = proposeFallbackChain;
|
|
39
|
+
exports.getFallbackEntryAvailability = getFallbackEntryAvailability;
|
|
40
|
+
exports.pickEarliestResetRung = pickEarliestResetRung;
|
|
41
|
+
exports.pickFallbackCandidates = pickFallbackCandidates;
|
|
42
|
+
exports.decideFallbackSwitch = decideFallbackSwitch;
|
|
43
|
+
exports.resolveOpenCodeLimitedUntil = resolveOpenCodeLimitedUntil;
|
|
44
|
+
exports.buildFallbackSwitchCallbackData = buildFallbackSwitchCallbackData;
|
|
45
|
+
exports.parseFallbackSwitchCallbackData = parseFallbackSwitchCallbackData;
|
|
46
|
+
exports.getFallbackSwitchTapDecision = getFallbackSwitchTapDecision;
|
|
47
|
+
exports.buildFallbackMoveUpCallback = buildFallbackMoveUpCallback;
|
|
48
|
+
exports.buildFallbackMoveDownCallback = buildFallbackMoveDownCallback;
|
|
49
|
+
exports.buildFallbackRemoveCallback = buildFallbackRemoveCallback;
|
|
50
|
+
exports.buildFallbackOpenCallback = buildFallbackOpenCallback;
|
|
51
|
+
exports.buildFallbackToggleCallback = buildFallbackToggleCallback;
|
|
52
|
+
exports.buildFallbackAddClaudeCallback = buildFallbackAddClaudeCallback;
|
|
53
|
+
exports.buildFallbackAddClaudeModelCallback = buildFallbackAddClaudeModelCallback;
|
|
54
|
+
exports.buildFallbackAddProviderCallback = buildFallbackAddProviderCallback;
|
|
55
|
+
exports.buildFallbackAddModelPageCallback = buildFallbackAddModelPageCallback;
|
|
56
|
+
exports.buildFallbackAddModelCallback = buildFallbackAddModelCallback;
|
|
57
|
+
exports.parseFallbackEditCallback = parseFallbackEditCallback;
|
|
58
|
+
const claudeProfiles_1 = require("./claudeProfiles");
|
|
59
|
+
const claudeUsage_1 = require("./claudeUsage");
|
|
60
|
+
/** The chain is a short priority list; a longer one is never consulted past the first available entry anyway. */
|
|
61
|
+
exports.fallbackChainMaxLength = 12;
|
|
62
|
+
/** The most «switch to …» buttons a limit notice offers (best first); the rest of the chain is in `/fallback`. */
|
|
63
|
+
exports.fallbackSwitchMaxOffers = 3;
|
|
64
|
+
/** Claude's CLI model aliases (`claudeJsonStreamAdapter.getAvailableModels`), the choices a Claude entry offers. */
|
|
65
|
+
exports.fallbackClaudeModelAliases = ['fable', 'opus', 'sonnet', 'haiku'];
|
|
66
|
+
const claudeModelAliasRe = /^[a-z0-9][a-z0-9._-]{0,31}$/;
|
|
67
|
+
const openCodeProviderIdRe = /^[a-z0-9][a-z0-9._-]*$/;
|
|
68
|
+
// ── shape ──
|
|
69
|
+
/** `provider/model` → its two halves; `null` for a label without a provider segment. */
|
|
70
|
+
function parseOpenCodeModelLabel(label) {
|
|
71
|
+
const index = label.indexOf('/');
|
|
72
|
+
if (index <= 0 || index === label.length - 1)
|
|
73
|
+
return null;
|
|
74
|
+
const providerId = label.slice(0, index);
|
|
75
|
+
if (!openCodeProviderIdRe.test(providerId))
|
|
76
|
+
return null;
|
|
77
|
+
return { providerId, modelId: label.slice(index + 1) };
|
|
78
|
+
}
|
|
79
|
+
function buildOpenCodeModelLabel(entry) {
|
|
80
|
+
return `${entry.providerId}/${entry.modelId}`;
|
|
81
|
+
}
|
|
82
|
+
/** Whether two entries name the same rung (backend, account / provider and model alike). */
|
|
83
|
+
function checkIsSameFallbackEntry(a, b) {
|
|
84
|
+
if (a.backend === 'claude' && b.backend === 'claude')
|
|
85
|
+
return a.profile === b.profile && a.model === b.model;
|
|
86
|
+
if (a.backend === 'opencode' && b.backend === 'opencode')
|
|
87
|
+
return a.providerId === b.providerId && a.modelId === b.modelId;
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* @description Whether two entries share the thing a usage limit exhausts: the Claude ACCOUNT (its windows
|
|
92
|
+
* are per account, whatever the model) or the OpenCode provider+model. A limit on `a` makes every entry
|
|
93
|
+
* `checkIsSameFallbackAccount(a, b)` just as limited.
|
|
94
|
+
*/
|
|
95
|
+
function checkIsSameFallbackAccount(a, b) {
|
|
96
|
+
if (a.backend === 'claude' && b.backend === 'claude')
|
|
97
|
+
return a.profile === b.profile;
|
|
98
|
+
if (a.backend === 'opencode' && b.backend === 'opencode')
|
|
99
|
+
return a.providerId === b.providerId && a.modelId === b.modelId;
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
/** `claude:work:fable` / `opencode:openai/gpt-5` — the entry as one token (logs, tests, the revision hash). */
|
|
103
|
+
function formatFallbackEntryKey(entry) {
|
|
104
|
+
return entry.backend === 'claude'
|
|
105
|
+
? `claude:${entry.profile}:${entry.model ?? '-'}`
|
|
106
|
+
: `opencode:${buildOpenCodeModelLabel(entry)}`;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* @description The entry for a human: `Claude · work · fable`, `Claude · default · <topic's model>`,
|
|
110
|
+
* `OpenCode · openai/gpt-5`. The backend words and the topic-model stand-in come localised from the caller.
|
|
111
|
+
*/
|
|
112
|
+
function formatFallbackEntryLabel(entry, words) {
|
|
113
|
+
if (entry.backend === 'claude')
|
|
114
|
+
return `${words.claude} · ${entry.profile} · ${entry.model ?? words.topicModel}`;
|
|
115
|
+
return `${words.openCode} · ${buildOpenCodeModelLabel(entry)}`;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* @description The chain as `state.json` may hold it, validated entry by entry: a malformed rung (a hand edit,
|
|
119
|
+
* an older shape) is dropped, never thrown on — the chain is advisory and the bot must boot. Duplicates are
|
|
120
|
+
* folded (first wins) and the cap applied.
|
|
121
|
+
*/
|
|
122
|
+
function normaliseFallbackChain(raw) {
|
|
123
|
+
if (!Array.isArray(raw))
|
|
124
|
+
return [];
|
|
125
|
+
const chain = [];
|
|
126
|
+
for (const item of raw) {
|
|
127
|
+
const entry = readFallbackEntry(item);
|
|
128
|
+
if (entry && !chain.some((known) => checkIsSameFallbackEntry(known, entry)))
|
|
129
|
+
chain.push(entry);
|
|
130
|
+
if (chain.length >= exports.fallbackChainMaxLength)
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
return chain;
|
|
134
|
+
}
|
|
135
|
+
function readFallbackEntry(item) {
|
|
136
|
+
if (!item || typeof item !== 'object')
|
|
137
|
+
return null;
|
|
138
|
+
const record = item;
|
|
139
|
+
if (record.backend === 'claude') {
|
|
140
|
+
const profile = record.profile;
|
|
141
|
+
if (typeof profile !== 'string' || (profile !== claudeProfiles_1.defaultClaudeProfileName && !(0, claudeProfiles_1.checkIsValidClaudeProfileName)(profile)))
|
|
142
|
+
return null;
|
|
143
|
+
const model = record.model;
|
|
144
|
+
if (model !== null && model !== undefined && (typeof model !== 'string' || !claudeModelAliasRe.test(model)))
|
|
145
|
+
return null;
|
|
146
|
+
return withDisabledFlag({ backend: 'claude', profile, model: typeof model === 'string' ? model : null }, record.disabled);
|
|
147
|
+
}
|
|
148
|
+
if (record.backend === 'opencode') {
|
|
149
|
+
if (typeof record.providerId !== 'string' || typeof record.modelId !== 'string' || record.modelId === '')
|
|
150
|
+
return null;
|
|
151
|
+
if (!openCodeProviderIdRe.test(record.providerId))
|
|
152
|
+
return null;
|
|
153
|
+
return withDisabledFlag({ backend: 'opencode', providerId: record.providerId, modelId: record.modelId }, record.disabled);
|
|
154
|
+
}
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
/** Keep `disabled` only when it is `true`: an enabled rung is persisted without the field. */
|
|
158
|
+
function withDisabledFlag(entry, disabled) {
|
|
159
|
+
return disabled === true ? { ...entry, disabled: true } : entry;
|
|
160
|
+
}
|
|
161
|
+
/** Whether the rung is excluded from automatic switching. */
|
|
162
|
+
function checkIsFallbackEntryDisabled(entry) {
|
|
163
|
+
return entry.disabled === true;
|
|
164
|
+
}
|
|
165
|
+
/** Flip the rung at `index` between included and excluded (a NEW chain). */
|
|
166
|
+
function toggleFallbackEntryDisabled(chain, index) {
|
|
167
|
+
if (!Number.isInteger(index) || index < 0 || index >= chain.length)
|
|
168
|
+
return { ok: false, reason: 'outOfRange' };
|
|
169
|
+
return {
|
|
170
|
+
ok: true,
|
|
171
|
+
chain: chain.map((entry, i) => {
|
|
172
|
+
if (i !== index)
|
|
173
|
+
return entry;
|
|
174
|
+
if (entry.disabled === true) {
|
|
175
|
+
const { disabled: _dropped, ...enabled } = entry;
|
|
176
|
+
return enabled;
|
|
177
|
+
}
|
|
178
|
+
return { ...entry, disabled: true };
|
|
179
|
+
}),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
function addFallbackEntry(chain, entry) {
|
|
183
|
+
if (chain.some((known) => checkIsSameFallbackEntry(known, entry)))
|
|
184
|
+
return { ok: false, reason: 'duplicate' };
|
|
185
|
+
if (chain.length >= exports.fallbackChainMaxLength)
|
|
186
|
+
return { ok: false, reason: 'full' };
|
|
187
|
+
return { ok: true, chain: [...chain, entry] };
|
|
188
|
+
}
|
|
189
|
+
function removeFallbackEntry(chain, index) {
|
|
190
|
+
if (!Number.isInteger(index) || index < 0 || index >= chain.length)
|
|
191
|
+
return { ok: false, reason: 'outOfRange' };
|
|
192
|
+
return { ok: true, chain: chain.filter((_, i) => i !== index) };
|
|
193
|
+
}
|
|
194
|
+
/** Move the rung at `index` one step up (`-1`) or down (`+1`); the ends are clamped (a no-op, still `ok`). */
|
|
195
|
+
function moveFallbackEntry(chain, index, delta) {
|
|
196
|
+
if (!Number.isInteger(index) || index < 0 || index >= chain.length)
|
|
197
|
+
return { ok: false, reason: 'outOfRange' };
|
|
198
|
+
const target = index + delta;
|
|
199
|
+
if (target < 0 || target >= chain.length)
|
|
200
|
+
return { ok: true, chain: [...chain] };
|
|
201
|
+
const next = [...chain];
|
|
202
|
+
[next[index], next[target]] = [next[target], next[index]];
|
|
203
|
+
return { ok: true, chain: next };
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* @description A short, stable fingerprint of the chain's CONTENT (FNV-1a over the entry keys, 8 hex digits).
|
|
207
|
+
* Every edit button of the picker bakes it in: a tap whose revision is not the chain's current one came from a
|
|
208
|
+
* keyboard posted before a later edit, and its index would point at another rung — it is refused as stale.
|
|
209
|
+
*/
|
|
210
|
+
function getFallbackChainRevision(chain) {
|
|
211
|
+
const text = chain.map((entry) => `${formatFallbackEntryKey(entry)}${entry.disabled === true ? '!' : ''}`).join('\n');
|
|
212
|
+
let hash = 0x811c9dc5;
|
|
213
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
214
|
+
hash ^= text.charCodeAt(index);
|
|
215
|
+
hash = Math.imul(hash, 0x01000193);
|
|
216
|
+
}
|
|
217
|
+
return (hash >>> 0).toString(16).padStart(8, '0');
|
|
218
|
+
}
|
|
219
|
+
// ── the draft ──
|
|
220
|
+
/**
|
|
221
|
+
* The models a provider's draft rung prefers, in order: the strongest general-purpose model each family
|
|
222
|
+
* ships. The first model of the provider that matches a pattern wins; a provider with no match gets its first
|
|
223
|
+
* model. A deliberately short, conservative list — the operator reorders anyway.
|
|
224
|
+
*/
|
|
225
|
+
const preferredOpenCodeModelPatterns = [
|
|
226
|
+
/opus/i,
|
|
227
|
+
/^gpt-5(?!.*(mini|nano|codex))/i,
|
|
228
|
+
/^o3(?!-mini)/i,
|
|
229
|
+
/gemini-[\d.]+-pro/i,
|
|
230
|
+
/sonnet/i,
|
|
231
|
+
/grok-4/i,
|
|
232
|
+
/deepseek-(?:r1|reasoner)/i,
|
|
233
|
+
/qwen3/i,
|
|
234
|
+
];
|
|
235
|
+
/** The provider ids of a catalog, in first-seen order. */
|
|
236
|
+
function listOpenCodeProviders(models) {
|
|
237
|
+
const providers = [];
|
|
238
|
+
for (const label of models) {
|
|
239
|
+
const parsed = parseOpenCodeModelLabel(label);
|
|
240
|
+
if (parsed && !providers.includes(parsed.providerId))
|
|
241
|
+
providers.push(parsed.providerId);
|
|
242
|
+
}
|
|
243
|
+
return providers;
|
|
244
|
+
}
|
|
245
|
+
/** The model ids of one provider, in catalog order. */
|
|
246
|
+
function listOpenCodeModelsOfProvider(models, providerId) {
|
|
247
|
+
const ids = [];
|
|
248
|
+
for (const label of models) {
|
|
249
|
+
const parsed = parseOpenCodeModelLabel(label);
|
|
250
|
+
if (parsed && parsed.providerId === providerId && !ids.includes(parsed.modelId))
|
|
251
|
+
ids.push(parsed.modelId);
|
|
252
|
+
}
|
|
253
|
+
return ids;
|
|
254
|
+
}
|
|
255
|
+
/** The provider's best model by {@link preferredOpenCodeModelPatterns}, else its first; `null` for an unknown provider. */
|
|
256
|
+
function pickPreferredOpenCodeModel(models, providerId) {
|
|
257
|
+
const ids = listOpenCodeModelsOfProvider(models, providerId);
|
|
258
|
+
if (ids.length === 0)
|
|
259
|
+
return null;
|
|
260
|
+
for (const pattern of preferredOpenCodeModelPatterns) {
|
|
261
|
+
const match = ids.find((id) => pattern.test(id));
|
|
262
|
+
if (match)
|
|
263
|
+
return match;
|
|
264
|
+
}
|
|
265
|
+
return ids[0];
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* @description The draft the bot PROPOSES from what it detected: the signed-in Claude profiles in their
|
|
269
|
+
* registry order (each keeping the topic's model), then OpenCode — the recently picked models that are still
|
|
270
|
+
* in the catalog, then every other provider's preferred model. Only what is actually available is proposed; a
|
|
271
|
+
* profile never probed counts as signed in (the CLI reports a signed-out one as `false`).
|
|
272
|
+
*/
|
|
273
|
+
function proposeFallbackChain(detection, previous = []) {
|
|
274
|
+
let chain = [];
|
|
275
|
+
const push = (entry) => {
|
|
276
|
+
const added = addFallbackEntry(chain, entry);
|
|
277
|
+
if (added.ok)
|
|
278
|
+
chain = added.chain;
|
|
279
|
+
};
|
|
280
|
+
for (const profile of detection.claudeProfiles) {
|
|
281
|
+
if (profile.loggedIn === false)
|
|
282
|
+
continue;
|
|
283
|
+
push({ backend: 'claude', profile: profile.name, model: null });
|
|
284
|
+
}
|
|
285
|
+
const catalog = new Set(detection.openCodeModels);
|
|
286
|
+
for (const label of detection.recentOpenCodeModels) {
|
|
287
|
+
const parsed = parseOpenCodeModelLabel(label);
|
|
288
|
+
if (parsed && catalog.has(label))
|
|
289
|
+
push({ backend: 'opencode', ...parsed });
|
|
290
|
+
}
|
|
291
|
+
for (const providerId of listOpenCodeProviders(detection.openCodeModels)) {
|
|
292
|
+
const modelId = pickPreferredOpenCodeModel(detection.openCodeModels, providerId);
|
|
293
|
+
if (modelId !== null)
|
|
294
|
+
push({ backend: 'opencode', providerId, modelId });
|
|
295
|
+
}
|
|
296
|
+
return chain.map((entry) => (checkIsExcludedByPrevious(entry, previous) ? { ...entry, disabled: true } : entry));
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Whether the operator had EXCLUDED this draft rung from switching in the chain being replaced: the Claude
|
|
300
|
+
* account (any model) or the OpenCode provider (the draft may prefer another model of it) has a disabled rung
|
|
301
|
+
* there and no enabled one. A rebuild never silently re-enables what was switched off.
|
|
302
|
+
*/
|
|
303
|
+
function checkIsExcludedByPrevious(entry, previous) {
|
|
304
|
+
const sameOwner = (other) => (entry.backend === 'claude'
|
|
305
|
+
? other.backend === 'claude' && other.profile === entry.profile
|
|
306
|
+
: other.backend === 'opencode' && other.providerId === entry.providerId);
|
|
307
|
+
const related = previous.filter(sameOwner);
|
|
308
|
+
return related.length > 0 && related.every(checkIsFallbackEntryDisabled);
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* @description Whether a rung can take work over NOW. A Claude profile is available when it is known, signed in
|
|
312
|
+
* and eligible by the usage report (not marked limited, not at 100 % on the windows its model drains — stale
|
|
313
|
+
* usage is allowed: the chain is the operator's explicit order, not a headroom race). An OpenCode model is
|
|
314
|
+
* available when the live catalog lists it and its limit mark, if any, lies in the past.
|
|
315
|
+
*/
|
|
316
|
+
function getFallbackEntryAvailability(entry, detection, nowMs) {
|
|
317
|
+
if (entry.backend === 'claude') {
|
|
318
|
+
const profile = detection.claudeProfiles.find((candidate) => candidate.name === entry.profile);
|
|
319
|
+
if (!profile)
|
|
320
|
+
return { status: 'missing' };
|
|
321
|
+
if (profile.loggedIn === false)
|
|
322
|
+
return { status: 'signedOut' };
|
|
323
|
+
if (profile.limitedUntil !== null && Date.parse(profile.limitedUntil) > nowMs)
|
|
324
|
+
return { status: 'limited', until: profile.limitedUntil };
|
|
325
|
+
const report = (0, claudeUsage_1.buildClaudeProfilesReport)([profile], entry.model, nowMs);
|
|
326
|
+
if (!report.profiles[0]?.isEligible)
|
|
327
|
+
return { status: 'limited', until: getExhaustedWindowReset(profile, entry.model, nowMs) ?? new Date(nowMs).toISOString() };
|
|
328
|
+
return { status: 'available' };
|
|
329
|
+
}
|
|
330
|
+
const label = buildOpenCodeModelLabel(entry);
|
|
331
|
+
if (!detection.openCodeModels.includes(label))
|
|
332
|
+
return { status: 'missing' };
|
|
333
|
+
const limitedUntil = detection.openCodeLimits[label];
|
|
334
|
+
if (limitedUntil !== undefined && Date.parse(limitedUntil) > nowMs)
|
|
335
|
+
return { status: 'limited', until: limitedUntil };
|
|
336
|
+
return { status: 'available' };
|
|
337
|
+
}
|
|
338
|
+
/** The latest reset among the windows a model drains that are at 100 % and still ahead; `null` when none names one. */
|
|
339
|
+
function getExhaustedWindowReset(profile, model, nowMs) {
|
|
340
|
+
let latest = null;
|
|
341
|
+
for (const kind of (0, claudeUsage_1.getRelevantClaudeUsageKinds)(model)) {
|
|
342
|
+
const bucket = (0, claudeUsage_1.getClaudeUsageBucket)(profile.usage, kind);
|
|
343
|
+
if (!bucket || bucket.percent < 100 || bucket.resetsAt === null)
|
|
344
|
+
continue;
|
|
345
|
+
const at = Date.parse(bucket.resetsAt);
|
|
346
|
+
if (Number.isFinite(at) && at > nowMs && (latest === null || at > latest))
|
|
347
|
+
latest = at;
|
|
348
|
+
}
|
|
349
|
+
return latest === null ? null : new Date(latest).toISOString();
|
|
350
|
+
}
|
|
351
|
+
/** Two resets closer than this count as the same moment (the current rung then wins: no needless switch). */
|
|
352
|
+
exports.fallbackEarliestResetToleranceMs = 60_000;
|
|
353
|
+
/**
|
|
354
|
+
* @description The rung a usage-limit WAIT should end on when nothing has room now: of the enabled rungs of
|
|
355
|
+
* `chain` and the rung the topic is on (`current`), the one whose limit resets EARLIEST. `null` when some rung
|
|
356
|
+
* is still available (the normal switch plan applies) or none names a future reset. `isCurrent` says the topic's
|
|
357
|
+
* own rung resets first (or within {@link fallbackEarliestResetToleranceMs} of the first): the wait stays as it
|
|
358
|
+
* is. Signed-out and missing rungs are skipped; rungs of the current account count as the current rung.
|
|
359
|
+
*/
|
|
360
|
+
function pickEarliestResetRung(input) {
|
|
361
|
+
const rungs = input.chain.filter((entry) => !checkIsFallbackEntryDisabled(entry));
|
|
362
|
+
const found = [];
|
|
363
|
+
const consider = (entry, isCurrent) => {
|
|
364
|
+
const availability = getFallbackEntryAvailability(entry, input.detection, input.nowMs);
|
|
365
|
+
if (availability.status === 'available')
|
|
366
|
+
return !isCurrent;
|
|
367
|
+
if (availability.status !== 'limited')
|
|
368
|
+
return false;
|
|
369
|
+
const untilMs = Date.parse(availability.until);
|
|
370
|
+
if (Number.isFinite(untilMs) && untilMs > input.nowMs)
|
|
371
|
+
found.push({ entry, untilMs, isCurrent });
|
|
372
|
+
return false;
|
|
373
|
+
};
|
|
374
|
+
if (input.current)
|
|
375
|
+
consider(input.current, true);
|
|
376
|
+
for (const entry of rungs) {
|
|
377
|
+
const isCurrent = input.current !== null && checkIsSameFallbackAccount(entry, input.current);
|
|
378
|
+
if (isCurrent)
|
|
379
|
+
continue;
|
|
380
|
+
if (consider(entry, false))
|
|
381
|
+
return null;
|
|
382
|
+
}
|
|
383
|
+
if (found.length === 0)
|
|
384
|
+
return null;
|
|
385
|
+
const earliest = found.reduce((best, item) => (item.untilMs < best.untilMs ? item : best));
|
|
386
|
+
const current = found.find((item) => item.isCurrent);
|
|
387
|
+
if (current && current.untilMs - earliest.untilMs <= exports.fallbackEarliestResetToleranceMs)
|
|
388
|
+
return current;
|
|
389
|
+
return earliest;
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* @description The rungs that may take a topic's work over, in CHAIN ORDER (the operator's priority): every
|
|
393
|
+
* available entry that is not the account the topic is on now (`current` — the one that just hit the limit;
|
|
394
|
+
* its other models are just as limited). A topic whose current position is not in the chain at all (a manual
|
|
395
|
+
* `/account` or `/model` pick) simply starts from the top: a manual choice is respected until it hits its own
|
|
396
|
+
* limit, then the chain decides.
|
|
397
|
+
*/
|
|
398
|
+
function pickFallbackCandidates(input) {
|
|
399
|
+
return input.chain.filter((entry) => {
|
|
400
|
+
if (checkIsFallbackEntryDisabled(entry))
|
|
401
|
+
return false;
|
|
402
|
+
if (input.current && checkIsSameFallbackAccount(entry, input.current))
|
|
403
|
+
return false;
|
|
404
|
+
return getFallbackEntryAvailability(entry, input.detection, input.nowMs).status === 'available';
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* @description What a usage limit leads to, given the ranked candidates and the auto-switch toggle. No
|
|
409
|
+
* candidate is `none` whatever the toggle says — the auto-switch never loops onto an exhausted rung; the bot
|
|
410
|
+
* then waits for the reset as before.
|
|
411
|
+
*/
|
|
412
|
+
function decideFallbackSwitch(input) {
|
|
413
|
+
if (input.candidates.length === 0)
|
|
414
|
+
return { action: 'none' };
|
|
415
|
+
if (input.isAutoSwitchEnabled)
|
|
416
|
+
return { action: 'auto', to: input.candidates[0] };
|
|
417
|
+
return { action: 'offer', candidates: input.candidates.slice(0, exports.fallbackSwitchMaxOffers) };
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* @description Until when an OpenCode provider/model that just hit a limit is marked limited: the instant the
|
|
421
|
+
* error named when it lies ahead, else `fallbackMs` from now (the retry's blind delay). A mark already further
|
|
422
|
+
* in the future is kept (the Claude twin is `resolveClaudeLimitedUntil`).
|
|
423
|
+
*/
|
|
424
|
+
function resolveOpenCodeLimitedUntil(input) {
|
|
425
|
+
let untilMs = input.resetAtMs !== undefined && input.resetAtMs > input.nowMs ? input.resetAtMs : input.nowMs + input.fallbackMs;
|
|
426
|
+
const existingMs = input.existingLimitedUntil === undefined ? Number.NaN : Date.parse(input.existingLimitedUntil);
|
|
427
|
+
if (Number.isFinite(existingMs) && existingMs > untilMs)
|
|
428
|
+
untilMs = existingMs;
|
|
429
|
+
return new Date(untilMs).toISOString();
|
|
430
|
+
}
|
|
431
|
+
// ── the «switch to …» buttons of a limit notice ──
|
|
432
|
+
/** `callback_data` prefix of a «switch to <entry>» button on a limit notice. */
|
|
433
|
+
exports.fallbackSwitchCallbackPrefix = 'fbsw_';
|
|
434
|
+
/**
|
|
435
|
+
* Prefix + a 13-digit episode + `_` + a one- or two-digit index: under 25 bytes. The INDEX points into the
|
|
436
|
+
* candidate list the bot remembered for that EPISODE (an epoch ms that identifies the limit error), so an old
|
|
437
|
+
* notice can never pick a rung of a newer list — its episode is no longer the topic's open one.
|
|
438
|
+
*/
|
|
439
|
+
exports.fallbackSwitchCallbackRe = new RegExp(`^${exports.fallbackSwitchCallbackPrefix}(\\d+)_(\\d{1,2})$`);
|
|
440
|
+
function buildFallbackSwitchCallbackData(episodeId, index) {
|
|
441
|
+
return `${exports.fallbackSwitchCallbackPrefix}${episodeId}_${index}`;
|
|
442
|
+
}
|
|
443
|
+
function parseFallbackSwitchCallbackData(data) {
|
|
444
|
+
const match = data.match(exports.fallbackSwitchCallbackRe);
|
|
445
|
+
if (!match)
|
|
446
|
+
return null;
|
|
447
|
+
return { episodeId: Number(match[1]), index: Number(match[2]) };
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* @description What a tap on a switch button does: `switch` to the candidate at `index` only while the topic's
|
|
451
|
+
* OPEN limit episode is the one the button was posted for and the index is inside that episode's list;
|
|
452
|
+
* `expired` otherwise (the operator wrote, the work resumed, the topic was switched already, a newer limit
|
|
453
|
+
* replaced the episode). `expired` changes nothing.
|
|
454
|
+
*/
|
|
455
|
+
function getFallbackSwitchTapDecision(input) {
|
|
456
|
+
if (!input.openOffer || input.openOffer.episodeId !== input.requestedEpisodeId)
|
|
457
|
+
return { kind: 'expired' };
|
|
458
|
+
const to = input.openOffer.candidates[input.index];
|
|
459
|
+
return to ? { kind: 'switch', to } : { kind: 'expired' };
|
|
460
|
+
}
|
|
461
|
+
// ── the picker's buttons (`/fallback`) ──
|
|
462
|
+
const revisionGroup = '([0-9a-f]{8})';
|
|
463
|
+
const indexGroup = '(\\d{1,2})';
|
|
464
|
+
/** Reorder / remove a rung — the chain revision is baked in, so a stale keyboard is refused. */
|
|
465
|
+
exports.fallbackMoveUpCallbackRe = new RegExp(`^fbk_up_${indexGroup}_${revisionGroup}$`);
|
|
466
|
+
exports.fallbackMoveDownCallbackRe = new RegExp(`^fbk_dn_${indexGroup}_${revisionGroup}$`);
|
|
467
|
+
exports.fallbackRemoveCallbackRe = new RegExp(`^fbk_rm_${indexGroup}_${revisionGroup}$`);
|
|
468
|
+
/** Include / exclude a rung from automatic switching (revision baked like the other edits). */
|
|
469
|
+
exports.fallbackToggleCallbackRe = new RegExp(`^fbk_tg_${indexGroup}_${revisionGroup}$`);
|
|
470
|
+
/** Open a rung's detail view from the list (same baked revision + index). */
|
|
471
|
+
exports.fallbackOpenCallbackRe = new RegExp(`^fbk_op_${indexGroup}_${revisionGroup}$`);
|
|
472
|
+
/** Open the «add» sub-picker (accounts and providers), then a Claude account's model list. */
|
|
473
|
+
exports.fallbackAddCallback = 'fbk_add';
|
|
474
|
+
exports.fallbackAddClaudeCallbackRe = new RegExp(`^fbk_addc_([a-z0-9][a-z0-9_-]{0,31})$`);
|
|
475
|
+
/** A Claude account + model: `-` = keep the topic's model. */
|
|
476
|
+
exports.fallbackAddClaudeModelCallbackRe = new RegExp(`^fbk_addcm_([a-z0-9][a-z0-9_-]{0,31})_(-|[a-z0-9][a-z0-9._-]{0,31})$`);
|
|
477
|
+
/** An OpenCode provider by its index in the sub-picker's own snapshot; then a model by index on a page. */
|
|
478
|
+
exports.fallbackAddProviderCallbackRe = new RegExp(`^fbk_addp_${indexGroup}$`);
|
|
479
|
+
exports.fallbackAddModelPageCallbackRe = new RegExp(`^fbk_addpg_(\\d{1,3})$`);
|
|
480
|
+
exports.fallbackAddModelCallbackRe = new RegExp(`^fbk_addm_(\\d{1,3})$`);
|
|
481
|
+
/** Draft the chain from what is detected (confirmed when a chain exists), empty it, back to the main picker. */
|
|
482
|
+
exports.fallbackProposeCallback = 'fbk_prop';
|
|
483
|
+
exports.fallbackProposeConfirmCallback = 'fbk_propok';
|
|
484
|
+
exports.fallbackClearCallback = 'fbk_clear';
|
|
485
|
+
exports.fallbackBackCallback = 'fbk_back';
|
|
486
|
+
/** Flip the auto-switch-on-limit setting (shared with `/account`): the topic's override, in General the instance default. */
|
|
487
|
+
exports.fallbackAutoSwitchOnCallback = 'fbk_asw_on';
|
|
488
|
+
exports.fallbackAutoSwitchOffCallback = 'fbk_asw_off';
|
|
489
|
+
/** A topic returns to the General value of the switch setting (drops its override). */
|
|
490
|
+
exports.fallbackAutoSwitchSameCallback = 'fbk_asw_same';
|
|
491
|
+
/** The «wait for the reset and continue» setting (`/auto_continue_limits`, shown in `/limits`): on / off / same as General. */
|
|
492
|
+
exports.fallbackWaitOnCallback = 'fbk_wait_on';
|
|
493
|
+
exports.fallbackWaitOffCallback = 'fbk_wait_off';
|
|
494
|
+
exports.fallbackWaitSameCallback = 'fbk_wait_same';
|
|
495
|
+
/**
|
|
496
|
+
* A topic's button of a setting on the main screen: opens that setting's sub-menu (on / off / as in General,
|
|
497
|
+
* whose buttons are the callbacks above) in the same message. General has no sub-menu — its button flips the value.
|
|
498
|
+
*/
|
|
499
|
+
exports.fallbackAutoSwitchOpenCallback = 'fbk_set_asw';
|
|
500
|
+
exports.fallbackWaitOpenCallback = 'fbk_set_wait';
|
|
501
|
+
function buildFallbackMoveUpCallback(index, revision) {
|
|
502
|
+
return `fbk_up_${index}_${revision}`;
|
|
503
|
+
}
|
|
504
|
+
function buildFallbackMoveDownCallback(index, revision) {
|
|
505
|
+
return `fbk_dn_${index}_${revision}`;
|
|
506
|
+
}
|
|
507
|
+
function buildFallbackRemoveCallback(index, revision) {
|
|
508
|
+
return `fbk_rm_${index}_${revision}`;
|
|
509
|
+
}
|
|
510
|
+
function buildFallbackOpenCallback(index, revision) {
|
|
511
|
+
return `fbk_op_${index}_${revision}`;
|
|
512
|
+
}
|
|
513
|
+
function buildFallbackToggleCallback(index, revision) {
|
|
514
|
+
return `fbk_tg_${index}_${revision}`;
|
|
515
|
+
}
|
|
516
|
+
function buildFallbackAddClaudeCallback(profile) {
|
|
517
|
+
return `fbk_addc_${profile}`;
|
|
518
|
+
}
|
|
519
|
+
function buildFallbackAddClaudeModelCallback(profile, model) {
|
|
520
|
+
return `fbk_addcm_${profile}_${model ?? '-'}`;
|
|
521
|
+
}
|
|
522
|
+
function buildFallbackAddProviderCallback(index) {
|
|
523
|
+
return `fbk_addp_${index}`;
|
|
524
|
+
}
|
|
525
|
+
function buildFallbackAddModelPageCallback(page) {
|
|
526
|
+
return `fbk_addpg_${page}`;
|
|
527
|
+
}
|
|
528
|
+
function buildFallbackAddModelCallback(index) {
|
|
529
|
+
return `fbk_addm_${index}`;
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* @description The index and revision an edit button carries, or `null` for foreign data. `isCurrent` says
|
|
533
|
+
* whether the revision is the chain's one NOW — `false` means the keyboard predates an edit and the tap must
|
|
534
|
+
* only re-render, never act.
|
|
535
|
+
*/
|
|
536
|
+
function parseFallbackEditCallback(data, re, currentRevision) {
|
|
537
|
+
const match = data.match(re);
|
|
538
|
+
if (!match)
|
|
539
|
+
return null;
|
|
540
|
+
return { index: Number(match[1]), isCurrent: match[2] === currentRevision };
|
|
541
|
+
}
|
|
542
|
+
//# sourceMappingURL=fallbackChain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallbackChain.js","sourceRoot":"","sources":["../../src/utils/fallbackChain.ts"],"names":[],"mappings":"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"}
|
|
@@ -91,10 +91,21 @@ export declare function parseJsonStreamTmuxSessionName(name: string): SessionKey
|
|
|
91
91
|
* even if the tmux server environment carries a key. With an `environment`
|
|
92
92
|
* (a tracker conversation, R32) claude gets exactly those variables instead —
|
|
93
93
|
* `env -i`, so nothing of the tmux server's environment reaches it (no API key
|
|
94
|
-
* either).
|
|
95
|
-
* (
|
|
94
|
+
* either). A non-default Claude account profile adds `CLAUDE_CONFIG_DIR=<dir>` to
|
|
95
|
+
* either `env` form (`utils/claudeProfiles.ts`); the default profile adds nothing,
|
|
96
|
+
* so the wrapper of a topic that never picked an account is byte-identical to
|
|
97
|
+
* the golden shape. The variable sits in the process environment — not only in
|
|
98
|
+
* the CLI's own reading of it — so a child `claude` the agent starts inherits the
|
|
99
|
+
* same account. All embedded strings are single-quoted; `claudePath` must be
|
|
100
|
+
* ABSOLUTE (tmux server PATH differs).
|
|
96
101
|
*/
|
|
97
|
-
export declare function buildWrapperScript(claudePath: string, args: readonly string[], workDir: string, paths: JsonStreamSessionPaths, environment?: Readonly<Record<string, string>> | null): string;
|
|
102
|
+
export declare function buildWrapperScript(claudePath: string, args: readonly string[], workDir: string, paths: JsonStreamSessionPaths, environment?: Readonly<Record<string, string>> | null, configDir?: string | null): string;
|
|
103
|
+
/**
|
|
104
|
+
* @description The `CLAUDE_CONFIG_DIR` a persisted wrapper script starts claude with, `null` for the default
|
|
105
|
+
* profile or an unreadable script. Read at adopt: the running process keeps the account it was spawned with,
|
|
106
|
+
* and the bot compares it with the profile its topic has now.
|
|
107
|
+
*/
|
|
108
|
+
export declare function readWrapperScriptConfigDir(wrapperFile: string): string | null;
|
|
98
109
|
/**
|
|
99
110
|
* @description Open the stdin FIFO for writing WITHOUT ever blocking: a plain
|
|
100
111
|
* `open(O_WRONLY)` on a FIFO with no reader hangs forever (the P1 probe's first
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonStreamHost.d.ts","sourceRoot":"","sources":["../../src/utils/jsonStreamHost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"jsonStreamHost.d.ts","sourceRoot":"","sources":["../../src/utils/jsonStreamHost.ts"],"names":[],"mappings":"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"}
|