charness 3.2.0 → 3.3.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 +3 -6
- package/DEVELOPMENT.md +15 -0
- package/README.md +111 -38
- package/SETUP.md +121 -16
- package/dist/adapters/adapterEventRouting.d.ts +2 -1
- package/dist/adapters/adapterEventRouting.d.ts.map +1 -1
- package/dist/adapters/adapterEventRouting.js +3 -0
- package/dist/adapters/adapterEventRouting.js.map +1 -1
- package/dist/adapters/adapterNames.d.ts +13 -0
- package/dist/adapters/adapterNames.d.ts.map +1 -1
- package/dist/adapters/adapterNames.js +16 -0
- package/dist/adapters/adapterNames.js.map +1 -1
- package/dist/adapters/backendUnavailableError.d.ts +11 -0
- package/dist/adapters/backendUnavailableError.d.ts.map +1 -0
- package/dist/adapters/backendUnavailableError.js +19 -0
- package/dist/adapters/backendUnavailableError.js.map +1 -0
- package/dist/adapters/claudeCliAdapter.d.ts +29 -6
- package/dist/adapters/claudeCliAdapter.d.ts.map +1 -1
- package/dist/adapters/claudeCliAdapter.js +70 -16
- package/dist/adapters/claudeCliAdapter.js.map +1 -1
- package/dist/adapters/claudeJsonStreamAdapter.d.ts +36 -3
- package/dist/adapters/claudeJsonStreamAdapter.d.ts.map +1 -1
- package/dist/adapters/claudeJsonStreamAdapter.js +93 -30
- package/dist/adapters/claudeJsonStreamAdapter.js.map +1 -1
- package/dist/adapters/createAdapter.d.ts +3 -14
- package/dist/adapters/createAdapter.d.ts.map +1 -1
- package/dist/adapters/createAdapter.js +9 -19
- package/dist/adapters/createAdapter.js.map +1 -1
- package/dist/adapters/openCodeAdapter.d.ts +140 -12
- package/dist/adapters/openCodeAdapter.d.ts.map +1 -1
- package/dist/adapters/openCodeAdapter.js +385 -119
- package/dist/adapters/openCodeAdapter.js.map +1 -1
- package/dist/apiErrorRetry.d.ts +70 -6
- package/dist/apiErrorRetry.d.ts.map +1 -1
- package/dist/apiErrorRetry.js +312 -34
- package/dist/apiErrorRetry.js.map +1 -1
- package/dist/apiRetryKick.d.ts +26 -1
- package/dist/apiRetryKick.d.ts.map +1 -1
- package/dist/apiRetryKick.js +41 -2
- package/dist/apiRetryKick.js.map +1 -1
- package/dist/bot.d.ts +2 -1
- package/dist/bot.d.ts.map +1 -1
- package/dist/bot.js +736 -184
- package/dist/bot.js.map +1 -1
- package/dist/cli/claudeProfiles.d.ts +1 -1
- package/dist/cli/claudeProfiles.js +1 -1
- package/dist/cli/hot.d.ts +7 -1
- package/dist/cli/hot.d.ts.map +1 -1
- package/dist/cli/hot.js +29 -3
- package/dist/cli/hot.js.map +1 -1
- package/dist/configDirFile.d.ts +73 -0
- package/dist/configDirFile.d.ts.map +1 -0
- package/dist/configDirFile.js +216 -0
- package/dist/configDirFile.js.map +1 -0
- package/dist/connectors/telegram/commands/autoContinueLimits.d.ts +2 -2
- package/dist/connectors/telegram/commands/autoContinueLimits.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/autoContinueLimits.js +4 -4
- package/dist/connectors/telegram/commands/autoContinueLimits.js.map +1 -1
- package/dist/connectors/telegram/commands/backendSwitch.d.ts +25 -0
- package/dist/connectors/telegram/commands/backendSwitch.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/backendSwitch.js +104 -0
- package/dist/connectors/telegram/commands/backendSwitch.js.map +1 -0
- package/dist/connectors/telegram/commands/callbackMessage.d.ts +12 -0
- package/dist/connectors/telegram/commands/callbackMessage.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/callbackMessage.js +24 -0
- package/dist/connectors/telegram/commands/callbackMessage.js.map +1 -1
- package/dist/connectors/telegram/commands/callbackToast.d.ts +36 -0
- package/dist/connectors/telegram/commands/callbackToast.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/callbackToast.js +83 -0
- package/dist/connectors/telegram/commands/callbackToast.js.map +1 -0
- package/dist/connectors/telegram/commands/claudeAccounts.d.ts +18 -0
- package/dist/connectors/telegram/commands/claudeAccounts.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/claudeAccounts.js +220 -66
- package/dist/connectors/telegram/commands/claudeAccounts.js.map +1 -1
- package/dist/connectors/telegram/commands/displayModes.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/displayModes.js +4 -2
- package/dist/connectors/telegram/commands/displayModes.js.map +1 -1
- package/dist/connectors/telegram/commands/fallbackChain.d.ts +5 -8
- package/dist/connectors/telegram/commands/fallbackChain.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/fallbackChain.js +183 -193
- package/dist/connectors/telegram/commands/fallbackChain.js.map +1 -1
- package/dist/connectors/telegram/commands/limitsBoard.d.ts +40 -0
- package/dist/connectors/telegram/commands/limitsBoard.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/limitsBoard.js +281 -0
- package/dist/connectors/telegram/commands/limitsBoard.js.map +1 -0
- package/dist/connectors/telegram/commands/modelPage.d.ts +130 -0
- package/dist/connectors/telegram/commands/modelPage.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/modelPage.js +120 -0
- package/dist/connectors/telegram/commands/modelPage.js.map +1 -0
- package/dist/connectors/telegram/commands/modelProviders.d.ts +9 -1
- package/dist/connectors/telegram/commands/modelProviders.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/modelProviders.js +203 -111
- package/dist/connectors/telegram/commands/modelProviders.js.map +1 -1
- package/dist/connectors/telegram/commands/stt.d.ts +32 -0
- package/dist/connectors/telegram/commands/stt.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/stt.js +460 -0
- package/dist/connectors/telegram/commands/stt.js.map +1 -0
- package/dist/effortLevels.d.ts +57 -7
- package/dist/effortLevels.d.ts.map +1 -1
- package/dist/effortLevels.js +65 -9
- package/dist/effortLevels.js.map +1 -1
- package/dist/i18n/de.d.ts.map +1 -1
- package/dist/i18n/de.js +160 -17
- package/dist/i18n/de.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +160 -17
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/es.d.ts.map +1 -1
- package/dist/i18n/es.js +160 -17
- package/dist/i18n/es.js.map +1 -1
- package/dist/i18n/fr.d.ts.map +1 -1
- package/dist/i18n/fr.js +160 -17
- package/dist/i18n/fr.js.map +1 -1
- package/dist/i18n/hi.d.ts.map +1 -1
- package/dist/i18n/hi.js +160 -17
- package/dist/i18n/hi.js.map +1 -1
- package/dist/i18n/ja.d.ts.map +1 -1
- package/dist/i18n/ja.js +160 -17
- package/dist/i18n/ja.js.map +1 -1
- package/dist/i18n/ka.d.ts.map +1 -1
- package/dist/i18n/ka.js +160 -17
- package/dist/i18n/ka.js.map +1 -1
- package/dist/i18n/pt.d.ts.map +1 -1
- package/dist/i18n/pt.js +160 -17
- package/dist/i18n/pt.js.map +1 -1
- package/dist/i18n/ru.d.ts.map +1 -1
- package/dist/i18n/ru.js +160 -17
- package/dist/i18n/ru.js.map +1 -1
- package/dist/i18n/uk.d.ts.map +1 -1
- package/dist/i18n/uk.js +160 -17
- package/dist/i18n/uk.js.map +1 -1
- package/dist/i18n/uz.d.ts.map +1 -1
- package/dist/i18n/uz.js +160 -17
- package/dist/i18n/uz.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +160 -17
- package/dist/i18n/zh.js.map +1 -1
- package/dist/installManager.d.ts +20 -4
- package/dist/installManager.d.ts.map +1 -1
- package/dist/installManager.js +82 -14
- package/dist/installManager.js.map +1 -1
- package/dist/instanceSettings.d.ts +52 -0
- package/dist/instanceSettings.d.ts.map +1 -0
- package/dist/instanceSettings.js +136 -0
- package/dist/instanceSettings.js.map +1 -0
- package/dist/pinnedStatus.d.ts +7 -1
- package/dist/pinnedStatus.d.ts.map +1 -1
- package/dist/pinnedStatus.js +1 -1
- package/dist/pinnedStatus.js.map +1 -1
- package/dist/requests/requestLedger.d.ts +8 -0
- package/dist/requests/requestLedger.d.ts.map +1 -1
- package/dist/requests/requestLedger.js +19 -1
- package/dist/requests/requestLedger.js.map +1 -1
- package/dist/scheduler/mcpSurface.js +4 -4
- package/dist/scheduler/mcpSurface.js.map +1 -1
- package/dist/shutdown.d.ts +14 -0
- package/dist/shutdown.d.ts.map +1 -1
- package/dist/shutdown.js +16 -0
- package/dist/shutdown.js.map +1 -1
- package/dist/state.d.ts +54 -2
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +62 -1
- package/dist/state.js.map +1 -1
- package/dist/stt/sttAutoInstall.d.ts +39 -0
- package/dist/stt/sttAutoInstall.d.ts.map +1 -0
- package/dist/stt/sttAutoInstall.js +158 -0
- package/dist/stt/sttAutoInstall.js.map +1 -0
- package/dist/stt/sttChildEnv.d.ts +11 -0
- package/dist/stt/sttChildEnv.d.ts.map +1 -0
- package/dist/stt/sttChildEnv.js +30 -0
- package/dist/stt/sttChildEnv.js.map +1 -0
- package/dist/stt/sttConfigEdit.d.ts +71 -0
- package/dist/stt/sttConfigEdit.d.ts.map +1 -0
- package/dist/stt/sttConfigEdit.js +144 -0
- package/dist/stt/sttConfigEdit.js.map +1 -0
- package/dist/stt/sttInstall.d.ts +147 -0
- package/dist/stt/sttInstall.d.ts.map +1 -0
- package/dist/stt/sttInstall.js +491 -0
- package/dist/stt/sttInstall.js.map +1 -0
- package/dist/stt/sttInstallEntry.d.ts +2 -0
- package/dist/stt/sttInstallEntry.d.ts.map +1 -0
- package/dist/stt/sttInstallEntry.js +31 -0
- package/dist/stt/sttInstallEntry.js.map +1 -0
- package/dist/stt/sttInstallReporter.d.ts +45 -0
- package/dist/stt/sttInstallReporter.d.ts.map +1 -0
- package/dist/stt/sttInstallReporter.js +57 -0
- package/dist/stt/sttInstallReporter.js.map +1 -0
- package/dist/stt/sttRuntime.d.ts +35 -0
- package/dist/stt/sttRuntime.d.ts.map +1 -0
- package/dist/stt/sttRuntime.js +73 -0
- package/dist/stt/sttRuntime.js.map +1 -0
- package/dist/stt/sttScreenPlan.d.ts +193 -0
- package/dist/stt/sttScreenPlan.d.ts.map +1 -0
- package/dist/stt/sttScreenPlan.js +541 -0
- package/dist/stt/sttScreenPlan.js.map +1 -0
- package/dist/stt/sttSettings.d.ts +201 -0
- package/dist/stt/sttSettings.d.ts.map +1 -0
- package/dist/stt/sttSettings.js +387 -0
- package/dist/stt/sttSettings.js.map +1 -0
- package/dist/stt/sttSidecarOwner.d.ts +115 -0
- package/dist/stt/sttSidecarOwner.d.ts.map +1 -0
- package/dist/stt/sttSidecarOwner.js +475 -0
- package/dist/stt/sttSidecarOwner.js.map +1 -0
- package/dist/stt/transcribeChain.d.ts +36 -0
- package/dist/stt/transcribeChain.d.ts.map +1 -0
- package/dist/stt/transcribeChain.js +42 -0
- package/dist/stt/transcribeChain.js.map +1 -0
- package/dist/types.d.ts +77 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/adapterSwitchSessionIds.d.ts +32 -0
- package/dist/utils/adapterSwitchSessionIds.d.ts.map +1 -0
- package/dist/utils/adapterSwitchSessionIds.js +44 -0
- package/dist/utils/adapterSwitchSessionIds.js.map +1 -0
- package/dist/utils/backendSwitchPlan.d.ts +63 -0
- package/dist/utils/backendSwitchPlan.d.ts.map +1 -0
- package/dist/utils/backendSwitchPlan.js +73 -0
- package/dist/utils/backendSwitchPlan.js.map +1 -0
- package/dist/utils/claudeAccountPickerPlan.d.ts +12 -1
- package/dist/utils/claudeAccountPickerPlan.d.ts.map +1 -1
- package/dist/utils/claudeAccountPickerPlan.js +20 -1
- package/dist/utils/claudeAccountPickerPlan.js.map +1 -1
- package/dist/utils/claudeTranscriptContent.d.ts +24 -0
- package/dist/utils/claudeTranscriptContent.d.ts.map +1 -0
- package/dist/utils/claudeTranscriptContent.js +107 -0
- package/dist/utils/claudeTranscriptContent.js.map +1 -0
- package/dist/utils/claudeUsage.d.ts +47 -8
- package/dist/utils/claudeUsage.d.ts.map +1 -1
- package/dist/utils/claudeUsage.js +76 -14
- package/dist/utils/claudeUsage.js.map +1 -1
- package/dist/utils/claudeUsageRefresher.d.ts +8 -1
- package/dist/utils/claudeUsageRefresher.d.ts.map +1 -1
- package/dist/utils/claudeUsageRefresher.js +9 -4
- package/dist/utils/claudeUsageRefresher.js.map +1 -1
- package/dist/utils/effortPickerPlan.d.ts +54 -0
- package/dist/utils/effortPickerPlan.d.ts.map +1 -0
- package/dist/utils/effortPickerPlan.js +56 -0
- package/dist/utils/effortPickerPlan.js.map +1 -0
- package/dist/utils/ensureSessionPlan.d.ts +20 -4
- package/dist/utils/ensureSessionPlan.d.ts.map +1 -1
- package/dist/utils/ensureSessionPlan.js +17 -4
- package/dist/utils/ensureSessionPlan.js.map +1 -1
- package/dist/utils/fallbackBridge.d.ts +6 -2
- package/dist/utils/fallbackBridge.d.ts.map +1 -1
- package/dist/utils/fallbackBridge.js +10 -3
- package/dist/utils/fallbackBridge.js.map +1 -1
- package/dist/utils/fallbackChain.d.ts +36 -0
- package/dist/utils/fallbackChain.d.ts.map +1 -1
- package/dist/utils/fallbackChain.js +65 -1
- package/dist/utils/fallbackChain.js.map +1 -1
- package/dist/utils/fallbackSwitchNotice.d.ts +41 -0
- package/dist/utils/fallbackSwitchNotice.d.ts.map +1 -0
- package/dist/utils/fallbackSwitchNotice.js +75 -0
- package/dist/utils/fallbackSwitchNotice.js.map +1 -0
- package/dist/utils/fileSendService.d.ts +33 -10
- package/dist/utils/fileSendService.d.ts.map +1 -1
- package/dist/utils/fileSendService.js +78 -27
- package/dist/utils/fileSendService.js.map +1 -1
- package/dist/utils/jsonStreamHost.d.ts +39 -0
- package/dist/utils/jsonStreamHost.d.ts.map +1 -1
- package/dist/utils/jsonStreamHost.js +60 -1
- package/dist/utils/jsonStreamHost.js.map +1 -1
- package/dist/utils/limitEpisodeRecovery.d.ts +16 -2
- package/dist/utils/limitEpisodeRecovery.d.ts.map +1 -1
- package/dist/utils/limitEpisodeRecovery.js +44 -3
- package/dist/utils/limitEpisodeRecovery.js.map +1 -1
- package/dist/utils/limitSettings.d.ts +25 -0
- package/dist/utils/limitSettings.d.ts.map +1 -0
- package/dist/utils/limitSettings.js +31 -0
- package/dist/utils/limitSettings.js.map +1 -0
- package/dist/utils/limitsBoardPlan.d.ts +52 -0
- package/dist/utils/limitsBoardPlan.d.ts.map +1 -0
- package/dist/utils/limitsBoardPlan.js +93 -0
- package/dist/utils/limitsBoardPlan.js.map +1 -0
- package/dist/utils/openCodeUsage.d.ts +93 -0
- package/dist/utils/openCodeUsage.d.ts.map +1 -0
- package/dist/utils/openCodeUsage.js +248 -0
- package/dist/utils/openCodeUsage.js.map +1 -0
- package/dist/utils/operatorSwitchPlan.d.ts +61 -0
- package/dist/utils/operatorSwitchPlan.d.ts.map +1 -0
- package/dist/utils/operatorSwitchPlan.js +32 -0
- package/dist/utils/operatorSwitchPlan.js.map +1 -0
- package/dist/utils/promptDelivery.d.ts +40 -0
- package/dist/utils/promptDelivery.d.ts.map +1 -1
- package/dist/utils/promptDelivery.js +31 -0
- package/dist/utils/promptDelivery.js.map +1 -1
- package/dist/utils/recvPreviewRedaction.d.ts +14 -4
- package/dist/utils/recvPreviewRedaction.d.ts.map +1 -1
- package/dist/utils/recvPreviewRedaction.js +19 -7
- package/dist/utils/recvPreviewRedaction.js.map +1 -1
- package/dist/utils/startupReadiness.d.ts +3 -3
- package/dist/utils/startupReadiness.d.ts.map +1 -1
- package/dist/utils/startupReadiness.js +2 -2
- package/dist/utils/startupReadiness.js.map +1 -1
- package/dist/utils/threadStatusReport.d.ts +3 -1
- package/dist/utils/threadStatusReport.d.ts.map +1 -1
- package/dist/utils/threadStatusReport.js +4 -3
- package/dist/utils/threadStatusReport.js.map +1 -1
- package/dist/utils/timezone.d.ts +23 -0
- package/dist/utils/timezone.d.ts.map +1 -1
- package/dist/utils/timezone.js +38 -0
- package/dist/utils/timezone.js.map +1 -1
- package/dist/utils/transcribeAudio.d.ts +25 -12
- package/dist/utils/transcribeAudio.d.ts.map +1 -1
- package/dist/utils/transcribeAudio.js +39 -21
- package/dist/utils/transcribeAudio.js.map +1 -1
- package/dist/utils/usageRefreshBudget.d.ts +9 -0
- package/dist/utils/usageRefreshBudget.d.ts.map +1 -0
- package/dist/utils/usageRefreshBudget.js +27 -0
- package/dist/utils/usageRefreshBudget.js.map +1 -0
- package/examples/.env.example +7 -3
- package/examples/docker-compose.yml +9 -7
- package/package.json +2 -1
- package/stt/gigaam_sidecar.py +800 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* --best print ONLY the recommended profile's config directory — an EMPTY line for the default
|
|
9
9
|
* profile (set nothing) — so `CLAUDE_CONFIG_DIR="$(charness claude-profiles --best)"`
|
|
10
10
|
* works as is; exit 1 when no profile is eligible
|
|
11
|
-
* --model <name> the model the child will run (`fable` → the Fable weekly window counts)
|
|
11
|
+
* --model <name> the model the child will run (`fable` → the Fable weekly window counts besides the shared ones)
|
|
12
12
|
* --json the full report as JSON (the MCP tool's shape)
|
|
13
13
|
*
|
|
14
14
|
* Without a flag: one human line per profile. `DATA_DIR` comes from the environment the bot itself reads
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* --best print ONLY the recommended profile's config directory — an EMPTY line for the default
|
|
10
10
|
* profile (set nothing) — so `CLAUDE_CONFIG_DIR="$(charness claude-profiles --best)"`
|
|
11
11
|
* works as is; exit 1 when no profile is eligible
|
|
12
|
-
* --model <name> the model the child will run (`fable` → the Fable weekly window counts)
|
|
12
|
+
* --model <name> the model the child will run (`fable` → the Fable weekly window counts besides the shared ones)
|
|
13
13
|
* --json the full report as JSON (the MCP tool's shape)
|
|
14
14
|
*
|
|
15
15
|
* Without a flag: one human line per profile. `DATA_DIR` comes from the environment the bot itself reads
|
package/dist/cli/hot.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type SttOwnerContext } from '../stt/sttSidecarOwner';
|
|
1
2
|
interface HotOpenCodeDeps {
|
|
2
3
|
checkIsInstalled: (toolName: string) => boolean;
|
|
3
4
|
ensureOpenCodeServer: () => Promise<void>;
|
|
@@ -26,6 +27,11 @@ type HotChildName = 'tsc' | 'nodemon';
|
|
|
26
27
|
* resolve the project root from the bin's own realpath. `yarn hot` in the
|
|
27
28
|
* repo is the in-project equivalent.
|
|
28
29
|
*
|
|
30
|
+
* The supervisor is also the OWNER of the local speech engine's sidecar: it exports its pid and start
|
|
31
|
+
* token to the worker (`buildHotWorkerEnv`), the sidecar dies with it (its own watchdog covers a SIGKILL), and
|
|
32
|
+
* the supervisor's shutdown stops the recorded one. A reload of the worker leaves it running for the next
|
|
33
|
+
* worker to adopt.
|
|
34
|
+
*
|
|
29
35
|
* **Failure modes handled:**
|
|
30
36
|
* - fresh checkout → nodemon waits until `tsc -w` produces the worker entry;
|
|
31
37
|
* - broken intermediate TS edit → `tsc -w` doesn't emit, so nodemon
|
|
@@ -77,6 +83,6 @@ export declare function prepareHotOpenCodeServer(deps?: HotOpenCodeDeps): Promis
|
|
|
77
83
|
* override); empty/unset falls back to `launchCwd` — matching how `runBot`
|
|
78
84
|
* itself treats `WORK_ROOT` (`!process.env.WORK_ROOT`).
|
|
79
85
|
*/
|
|
80
|
-
export declare function buildHotWorkerEnv(baseEnv: NodeJS.ProcessEnv, launchCwd: string): NodeJS.ProcessEnv;
|
|
86
|
+
export declare function buildHotWorkerEnv(baseEnv: NodeJS.ProcessEnv, launchCwd: string, sttOwner?: SttOwnerContext): NodeJS.ProcessEnv;
|
|
81
87
|
export {};
|
|
82
88
|
//# sourceMappingURL=hot.d.ts.map
|
package/dist/cli/hot.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hot.d.ts","sourceRoot":"","sources":["../../src/cli/hot.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hot.d.ts","sourceRoot":"","sources":["../../src/cli/hot.ts"],"names":[],"mappings":"AAgBA,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAGhC,UAAU,eAAe;IACvB,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAChD,oBAAoB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,KAAK,YAAY,GAAG,KAAK,GAAG,SAAS,CAAC;AAMtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAmL5C;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,YAAY,EACvB,aAAa,EAAE,MAAM,CAAC,OAAO,GAC5B,MAAM,CAAC,OAAO,CAEhB;AAED,yEAAyE;AACzE,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEzE;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,OAAO,OAAO,CAAC,QAAQ,GAAG,OAAO,CAElF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,GAAE,eAKL,GACA,OAAO,CAAC,OAAO,CAAC,CAclB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,CAAC,UAAU,EAC1B,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,eAAe,GACzB,MAAM,CAAC,UAAU,CAWnB"}
|
package/dist/cli/hot.js
CHANGED
|
@@ -47,6 +47,7 @@ const connectorGuards_1 = require("./connectorGuards");
|
|
|
47
47
|
const connectorSet_1 = require("../platform/connectorSet");
|
|
48
48
|
const installManager_1 = require("../installManager");
|
|
49
49
|
const legacyNames_1 = require("../legacyNames");
|
|
50
|
+
const sttSidecarOwner_1 = require("../stt/sttSidecarOwner");
|
|
50
51
|
const legacyMigration_1 = require("../legacyMigration");
|
|
51
52
|
const tscWatchCompleteMarker = 'Watching for file changes.';
|
|
52
53
|
const tscWatchReadyMarker = `Found 0 errors. ${tscWatchCompleteMarker}`;
|
|
@@ -72,6 +73,11 @@ const tscWatchTailLength = tscWatchReadyMarker.length - 1;
|
|
|
72
73
|
* resolve the project root from the bin's own realpath. `yarn hot` in the
|
|
73
74
|
* repo is the in-project equivalent.
|
|
74
75
|
*
|
|
76
|
+
* The supervisor is also the OWNER of the local speech engine's sidecar: it exports its pid and start
|
|
77
|
+
* token to the worker (`buildHotWorkerEnv`), the sidecar dies with it (its own watchdog covers a SIGKILL), and
|
|
78
|
+
* the supervisor's shutdown stops the recorded one. A reload of the worker leaves it running for the next
|
|
79
|
+
* worker to adopt.
|
|
80
|
+
*
|
|
75
81
|
* **Failure modes handled:**
|
|
76
82
|
* - fresh checkout → nodemon waits until `tsc -w` produces the worker entry;
|
|
77
83
|
* - broken intermediate TS edit → `tsc -w` doesn't emit, so nodemon
|
|
@@ -134,6 +140,12 @@ async function runHot() {
|
|
|
134
140
|
const connectors = (0, connectorSet_1.parseConnectors)(process.env.CONNECTORS);
|
|
135
141
|
if (connectors.ok && connectors.connectors.includes('telegram'))
|
|
136
142
|
await prepareHotOpenCodeServer();
|
|
143
|
+
// The data dir the worker will use (a relative DATA_DIR resolves against the project root, nodemon's cwd).
|
|
144
|
+
const sttDataDir = path.resolve(projectRoot, process.env.DATA_DIR || (0, legacyNames_1.resolveDefaultDataDir)());
|
|
145
|
+
const supervisorIdentity = (0, installManager_1.getProcessIdentity)(process.pid);
|
|
146
|
+
const sttOwner = supervisorIdentity
|
|
147
|
+
? { pid: supervisorIdentity.pid, startToken: supervisorIdentity.startToken }
|
|
148
|
+
: undefined;
|
|
137
149
|
process.stderr.write(`charness hot: project=${projectRoot}\n` +
|
|
138
150
|
`charness hot: starting \`tsc -w\`; nodemon starts after the first completed compile.\n` +
|
|
139
151
|
`charness hot: Ctrl-C stops both watchers.\n`);
|
|
@@ -144,13 +156,14 @@ async function runHot() {
|
|
|
144
156
|
const children = new Set();
|
|
145
157
|
let nodemonChild = null;
|
|
146
158
|
let shuttingDown = false;
|
|
159
|
+
let isSidecarStopped = false;
|
|
147
160
|
let finalCode = 0;
|
|
148
161
|
let resolveChildrenStopped = null;
|
|
149
162
|
const childrenStopped = new Promise((resolve) => {
|
|
150
163
|
resolveChildrenStopped = resolve;
|
|
151
164
|
});
|
|
152
165
|
const checkShouldResolveChildren = () => {
|
|
153
|
-
if (shuttingDown && children.size === 0)
|
|
166
|
+
if (shuttingDown && children.size === 0 && isSidecarStopped)
|
|
154
167
|
resolveChildrenStopped?.();
|
|
155
168
|
};
|
|
156
169
|
const forwardSignal = (sig) => {
|
|
@@ -163,6 +176,16 @@ async function runHot() {
|
|
|
163
176
|
const childName = child === nodemonChild ? 'nodemon' : 'tsc';
|
|
164
177
|
child.kill(getHotChildShutdownSignal(childName, sig));
|
|
165
178
|
}
|
|
179
|
+
// The sidecar does not outlive its owner: stop the recorded one (guarded, bounded at ~3 s) while the
|
|
180
|
+
// watchers wind down; the wrapper exits only after both.
|
|
181
|
+
void (0, sttSidecarOwner_1.stopRecordedSttSidecar)((0, sttSidecarOwner_1.createDefaultSttSidecarOwnerDeps)(() => sttDataDir))
|
|
182
|
+
.catch((error) => {
|
|
183
|
+
process.stderr.write(`charness hot: stopping the local speech engine failed: ${error instanceof Error ? error.message : error}\n`);
|
|
184
|
+
})
|
|
185
|
+
.finally(() => {
|
|
186
|
+
isSidecarStopped = true;
|
|
187
|
+
checkShouldResolveChildren();
|
|
188
|
+
});
|
|
166
189
|
checkShouldResolveChildren();
|
|
167
190
|
};
|
|
168
191
|
for (const sig of ['SIGINT', 'SIGTERM', 'SIGHUP']) {
|
|
@@ -202,7 +225,7 @@ async function runHot() {
|
|
|
202
225
|
nodemonChild = (0, child_process_1.spawn)(process.execPath, [nodemonBin], {
|
|
203
226
|
cwd: projectRoot,
|
|
204
227
|
stdio: 'inherit',
|
|
205
|
-
env: buildHotWorkerEnv(process.env, launchCwd),
|
|
228
|
+
env: buildHotWorkerEnv(process.env, launchCwd, sttOwner),
|
|
206
229
|
});
|
|
207
230
|
registerChild(nodemonChild, 'nodemon');
|
|
208
231
|
};
|
|
@@ -299,13 +322,16 @@ async function prepareHotOpenCodeServer(deps = {
|
|
|
299
322
|
* override); empty/unset falls back to `launchCwd` — matching how `runBot`
|
|
300
323
|
* itself treats `WORK_ROOT` (`!process.env.WORK_ROOT`).
|
|
301
324
|
*/
|
|
302
|
-
function buildHotWorkerEnv(baseEnv, launchCwd) {
|
|
325
|
+
function buildHotWorkerEnv(baseEnv, launchCwd, sttOwner) {
|
|
303
326
|
return {
|
|
304
327
|
...baseEnv,
|
|
305
328
|
WORK_ROOT: baseEnv.WORK_ROOT || launchCwd,
|
|
306
329
|
// Both names: this supervisor may outlive a rename of the worker's code.
|
|
307
330
|
[legacyNames_1.hotReloadEnvName.current]: installManager_1.openCodeExternalHostEnvValue,
|
|
308
331
|
[legacyNames_1.hotReloadEnvName.legacy]: installManager_1.openCodeExternalHostEnvValue,
|
|
332
|
+
// The long-lived process the local speech engine's sidecar dies with. Without it (an older supervisor) the
|
|
333
|
+
// worker sees no owner and keeps the engine unavailable.
|
|
334
|
+
...(sttOwner ? { [sttSidecarOwner_1.sttOwnerPidEnvName]: sttOwner.pid.toString(), [sttSidecarOwner_1.sttOwnerStartTokenEnvName]: sttOwner.startToken } : {}),
|
|
309
335
|
};
|
|
310
336
|
}
|
|
311
337
|
/**
|
package/dist/cli/hot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hot.js","sourceRoot":"","sources":["../../src/cli/hot.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"hot.js","sourceRoot":"","sources":["../../src/cli/hot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** The OS error code (`ENOENT`, `EACCES`) of a failed fs call — a code names the problem, a message may quote a path. */
|
|
2
|
+
export declare function getErrnoCode(error: Error): string;
|
|
3
|
+
/** @description The OS error code of whatever a `catch` caught (`unknown` when it is not an `Error`). */
|
|
4
|
+
export declare function getCaughtErrnoCode(caught: unknown): string;
|
|
5
|
+
/**
|
|
6
|
+
* @description Where the config-directory file `fileName` lives: beside the instance's REAL env file (`ENV_FILE`
|
|
7
|
+
* for an isolated instance, else the charness config dir's `.env` — a pre-rename config dir included), after
|
|
8
|
+
* resolving the env file's symlink. With no env file at all, the canonical `~/.config/charness/`.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getConfigDirFilePath(fileName: string, env?: NodeJS.ProcessEnv, homeDir?: string): string;
|
|
11
|
+
/** @name ConfigValidation @description What a file's validator says about a parsed JSON object. */
|
|
12
|
+
export type ConfigValidation<TConfig> = {
|
|
13
|
+
ok: true;
|
|
14
|
+
config: TConfig;
|
|
15
|
+
} | {
|
|
16
|
+
ok: false;
|
|
17
|
+
errors: string[];
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* @name ConfigFileLoad
|
|
21
|
+
* @description What the file holds right now. `invalid` carries the LAST GOOD config (`null` when the file was never
|
|
22
|
+
* valid in this process); whether to keep serving it or to fall back to defaults is the file's own policy.
|
|
23
|
+
*/
|
|
24
|
+
export type ConfigFileLoad<TConfig> = {
|
|
25
|
+
status: 'missing';
|
|
26
|
+
config: TConfig;
|
|
27
|
+
} | {
|
|
28
|
+
status: 'ok';
|
|
29
|
+
config: TConfig;
|
|
30
|
+
} | {
|
|
31
|
+
status: 'invalid';
|
|
32
|
+
config: TConfig | null;
|
|
33
|
+
errors: string[];
|
|
34
|
+
};
|
|
35
|
+
export interface ConfigFileLoaderOptions<TConfig> {
|
|
36
|
+
/** The file's name as errors write it (`stt.json`). */
|
|
37
|
+
fileName: string;
|
|
38
|
+
/** The config of a file that does not exist. */
|
|
39
|
+
createEmpty: () => TConfig;
|
|
40
|
+
/** Validates a parsed JSON object; every error names its field and carries no value (the file may hold keys). */
|
|
41
|
+
validate: (parsedJson: object) => ConfigValidation<TConfig>;
|
|
42
|
+
}
|
|
43
|
+
export interface ConfigFileLoader<TConfig> {
|
|
44
|
+
/**
|
|
45
|
+
* Read and validate the file, cached by its stamp (mtime, size, inode) so a repeated call costs one `stat`.
|
|
46
|
+
* A missing file is the empty config; an unreadable or invalid one reports its errors.
|
|
47
|
+
*/
|
|
48
|
+
load: (filePath: string) => ConfigFileLoad<TConfig>;
|
|
49
|
+
/** Forget every cached load — for tests, which swap files under one path. */
|
|
50
|
+
resetCache: () => void;
|
|
51
|
+
}
|
|
52
|
+
/** @description A loader for one config-directory file: its own cache, the shared parse and error wording. */
|
|
53
|
+
export declare function createConfigFileLoader<TConfig>(options: ConfigFileLoaderOptions<TConfig>): ConfigFileLoader<TConfig>;
|
|
54
|
+
/**
|
|
55
|
+
* @description Write `value` as JSON to `filePath` with `fileMode`, creating missing directories, through a temp
|
|
56
|
+
* file and a rename so a reader never sees half a file. The caller validates first: a caller that builds an
|
|
57
|
+
* invalid file has a bug.
|
|
58
|
+
*/
|
|
59
|
+
export declare function writeJsonFileAtomically(filePath: string, value: object, fileMode: number): void;
|
|
60
|
+
/**
|
|
61
|
+
* @description Why {@link writeJsonFileAtomically} could not write beside `filePath` — an errno code (`EACCES`,
|
|
62
|
+
* `EROFS`, `ENOTDIR`, …) — or `null` when it can. The directory may not exist yet (the save creates it): the
|
|
63
|
+
* nearest existing ancestor must be a directory that accepts a new file.
|
|
64
|
+
*/
|
|
65
|
+
export declare function getConfigFileWriteBlock(filePath: string): string | null;
|
|
66
|
+
/**
|
|
67
|
+
* @description Is the config file kept on a container's OWN disk — the bot runs in a container and the directory
|
|
68
|
+
* that holds the file is not a mount (it shares the device of `/`)? Then every change the bot saves is lost when
|
|
69
|
+
* the container is re-created. The write check cannot see it: the container's disk is writable. Typical cause:
|
|
70
|
+
* only the env FILE was mounted, not its directory. A host, or a path that cannot be read, is never reported.
|
|
71
|
+
*/
|
|
72
|
+
export declare function checkIsConfigFileOnContainerDisk(filePath: string, checkIsPresent?: (candidate: string) => boolean, readDeviceId?: (directory: string) => number): boolean;
|
|
73
|
+
//# sourceMappingURL=configDirFile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configDirFile.d.ts","sourceRoot":"","sources":["../src/configDirFile.ts"],"names":[],"mappings":"AAiBA,yHAAyH;AACzH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEjD;AAED,yGAAyG;AACzG,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAE1D;AAeD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,OAAO,GAAE,MAAqB,GAAG,MAAM,CAGnI;AAED,mGAAmG;AACnG,MAAM,MAAM,gBAAgB,CAAC,OAAO,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAExG;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,OAAO,IAC9B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACjC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEpE,MAAM,WAAW,uBAAuB,CAAC,OAAO;IAC9C,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,iHAAiH;IACjH,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,gBAAgB,CAAC,OAAO,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,gBAAgB,CAAC,OAAO;IACvC;;;OAGG;IACH,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,cAAc,CAAC,OAAO,CAAC,CAAC;IACpD,6EAA6E;IAC7E,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAgBD,8GAA8G;AAC9G,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,uBAAuB,CAAC,OAAO,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAgDpH;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAU/F;AAkBD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASvE;AAMD;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,MAAM,EAChB,cAAc,GAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAuB,EAC9D,YAAY,GAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAkD,GACtF,OAAO,CAST"}
|
|
@@ -0,0 +1,216 @@
|
|
|
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.getErrnoCode = getErrnoCode;
|
|
37
|
+
exports.getCaughtErrnoCode = getCaughtErrnoCode;
|
|
38
|
+
exports.getConfigDirFilePath = getConfigDirFilePath;
|
|
39
|
+
exports.createConfigFileLoader = createConfigFileLoader;
|
|
40
|
+
exports.writeJsonFileAtomically = writeJsonFileAtomically;
|
|
41
|
+
exports.getConfigFileWriteBlock = getConfigFileWriteBlock;
|
|
42
|
+
exports.checkIsConfigFileOnContainerDisk = checkIsConfigFileOnContainerDisk;
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const os = __importStar(require("os"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const legacyNames_1 = require("./legacyNames");
|
|
47
|
+
/**
|
|
48
|
+
* @description The mechanics every JSON file in the charness config directory shares (`stt.json`, `settings.json`):
|
|
49
|
+
* where it lives, a load cached by the file's stamp, an atomic save, and the two checks that say why a save cannot
|
|
50
|
+
* be kept. A file's own module adds its schema and its meaning; none of it is written twice.
|
|
51
|
+
*
|
|
52
|
+
* Location rules (owner decisions): the file sits beside the instance's REAL env file — a symlinked `.env` is
|
|
53
|
+
* resolved, so a file next to secrets never lands in a directory that only holds the link; under Docker the
|
|
54
|
+
* config DIRECTORY is mounted writable; there is no fallback location when it cannot be written.
|
|
55
|
+
*/
|
|
56
|
+
const unknownErrorCode = 'unknown';
|
|
57
|
+
/** The OS error code (`ENOENT`, `EACCES`) of a failed fs call — a code names the problem, a message may quote a path. */
|
|
58
|
+
function getErrnoCode(error) {
|
|
59
|
+
return 'code' in error && typeof error.code === 'string' ? error.code : unknownErrorCode;
|
|
60
|
+
}
|
|
61
|
+
/** @description The OS error code of whatever a `catch` caught (`unknown` when it is not an `Error`). */
|
|
62
|
+
function getCaughtErrnoCode(caught) {
|
|
63
|
+
return caught instanceof Error ? getErrnoCode(caught) : unknownErrorCode;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* @description The directory `envFile` really lives in: a symlinked `.env` (the keys kept on an encrypted
|
|
67
|
+
* volume, the config dir holding only a link) resolves to its TARGET's directory. A plain file, or a link that
|
|
68
|
+
* cannot be resolved (dangling), keeps the directory it was named in.
|
|
69
|
+
*/
|
|
70
|
+
function getRealEnvFileDir(envFile) {
|
|
71
|
+
try {
|
|
72
|
+
return path.dirname(fs.realpathSync(envFile));
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return path.dirname(envFile);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* @description Where the config-directory file `fileName` lives: beside the instance's REAL env file (`ENV_FILE`
|
|
80
|
+
* for an isolated instance, else the charness config dir's `.env` — a pre-rename config dir included), after
|
|
81
|
+
* resolving the env file's symlink. With no env file at all, the canonical `~/.config/charness/`.
|
|
82
|
+
*/
|
|
83
|
+
function getConfigDirFilePath(fileName, env = process.env, homeDir = os.homedir()) {
|
|
84
|
+
const envFile = env.ENV_FILE || (0, legacyNames_1.resolveGlobalConfigEnvPath)(homeDir);
|
|
85
|
+
return path.join(getRealEnvFileDir(envFile), fileName);
|
|
86
|
+
}
|
|
87
|
+
/** Position of a JSON syntax error, without the quoted source text Node puts in its message. */
|
|
88
|
+
function getJsonErrorPosition(error) {
|
|
89
|
+
const position = /position (\d+)/.exec(error.message);
|
|
90
|
+
return position ? ` (at position ${position[1]})` : '';
|
|
91
|
+
}
|
|
92
|
+
/** @description A loader for one config-directory file: its own cache, the shared parse and error wording. */
|
|
93
|
+
function createConfigFileLoader(options) {
|
|
94
|
+
const { fileName, createEmpty, validate } = options;
|
|
95
|
+
const cacheByPath = new Map();
|
|
96
|
+
function parseText(text) {
|
|
97
|
+
let parsed;
|
|
98
|
+
try {
|
|
99
|
+
parsed = JSON.parse(text);
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
// Node quotes a slice of the text in the message, and the text may hold keys: name only the position.
|
|
103
|
+
return { ok: false, errors: [`${fileName} is not valid JSON${e instanceof Error ? getJsonErrorPosition(e) : ''}`] };
|
|
104
|
+
}
|
|
105
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
106
|
+
return { ok: false, errors: [`${fileName} must hold a JSON object`] };
|
|
107
|
+
}
|
|
108
|
+
return validate(parsed);
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
load(filePath) {
|
|
112
|
+
let stat;
|
|
113
|
+
try {
|
|
114
|
+
stat = fs.statSync(filePath);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
cacheByPath.delete(filePath);
|
|
118
|
+
return { status: 'missing', config: createEmpty() };
|
|
119
|
+
}
|
|
120
|
+
const stamp = `${stat.mtimeMs}:${stat.size}:${stat.ino}`;
|
|
121
|
+
const cached = cacheByPath.get(filePath);
|
|
122
|
+
if (cached?.stamp === stamp)
|
|
123
|
+
return cached.load;
|
|
124
|
+
const lastGood = cached?.lastGood ?? null;
|
|
125
|
+
let result;
|
|
126
|
+
try {
|
|
127
|
+
result = parseText(fs.readFileSync(filePath, 'utf8'));
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
result = { ok: false, errors: [`${fileName} could not be read (${getCaughtErrnoCode(e)})`] };
|
|
131
|
+
}
|
|
132
|
+
const load = result.ok
|
|
133
|
+
? { status: 'ok', config: result.config }
|
|
134
|
+
: { status: 'invalid', config: lastGood, errors: result.errors };
|
|
135
|
+
cacheByPath.set(filePath, { stamp, load, lastGood: result.ok ? result.config : lastGood });
|
|
136
|
+
return load;
|
|
137
|
+
},
|
|
138
|
+
resetCache() {
|
|
139
|
+
cacheByPath.clear();
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* @description Write `value` as JSON to `filePath` with `fileMode`, creating missing directories, through a temp
|
|
145
|
+
* file and a rename so a reader never sees half a file. The caller validates first: a caller that builds an
|
|
146
|
+
* invalid file has a bug.
|
|
147
|
+
*/
|
|
148
|
+
function writeJsonFileAtomically(filePath, value, fileMode) {
|
|
149
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
150
|
+
const tempPath = `${filePath}.${process.pid}.tmp`;
|
|
151
|
+
try {
|
|
152
|
+
fs.writeFileSync(tempPath, `${JSON.stringify(value, null, 2)}\n`, { mode: fileMode });
|
|
153
|
+
fs.renameSync(tempPath, filePath);
|
|
154
|
+
}
|
|
155
|
+
catch (e) {
|
|
156
|
+
fs.rmSync(tempPath, { force: true });
|
|
157
|
+
throw e;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/** The nearest directory of `filePath`'s ancestors that exists (the save creates the rest), or the errno code that stops the walk. */
|
|
161
|
+
function findNearestExistingDirectory(filePath) {
|
|
162
|
+
let directory = path.dirname(filePath);
|
|
163
|
+
for (;;) {
|
|
164
|
+
try {
|
|
165
|
+
fs.statSync(directory);
|
|
166
|
+
return { directory };
|
|
167
|
+
}
|
|
168
|
+
catch (e) {
|
|
169
|
+
const code = getCaughtErrnoCode(e);
|
|
170
|
+
const parent = path.dirname(directory);
|
|
171
|
+
if (code !== 'ENOENT' || parent === directory)
|
|
172
|
+
return { errorCode: code };
|
|
173
|
+
directory = parent;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* @description Why {@link writeJsonFileAtomically} could not write beside `filePath` — an errno code (`EACCES`,
|
|
179
|
+
* `EROFS`, `ENOTDIR`, …) — or `null` when it can. The directory may not exist yet (the save creates it): the
|
|
180
|
+
* nearest existing ancestor must be a directory that accepts a new file.
|
|
181
|
+
*/
|
|
182
|
+
function getConfigFileWriteBlock(filePath) {
|
|
183
|
+
const nearest = findNearestExistingDirectory(filePath);
|
|
184
|
+
if ('errorCode' in nearest)
|
|
185
|
+
return nearest.errorCode;
|
|
186
|
+
try {
|
|
187
|
+
fs.accessSync(nearest.directory, fs.constants.W_OK);
|
|
188
|
+
return fs.statSync(nearest.directory).isDirectory() ? null : 'ENOTDIR';
|
|
189
|
+
}
|
|
190
|
+
catch (e) {
|
|
191
|
+
return getCaughtErrnoCode(e);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/** Files a container runtime creates inside every container it starts (Docker, Podman). */
|
|
195
|
+
const containerMarkerFiles = ['/.dockerenv', '/run/.containerenv'];
|
|
196
|
+
const rootDirectory = '/';
|
|
197
|
+
/**
|
|
198
|
+
* @description Is the config file kept on a container's OWN disk — the bot runs in a container and the directory
|
|
199
|
+
* that holds the file is not a mount (it shares the device of `/`)? Then every change the bot saves is lost when
|
|
200
|
+
* the container is re-created. The write check cannot see it: the container's disk is writable. Typical cause:
|
|
201
|
+
* only the env FILE was mounted, not its directory. A host, or a path that cannot be read, is never reported.
|
|
202
|
+
*/
|
|
203
|
+
function checkIsConfigFileOnContainerDisk(filePath, checkIsPresent = fs.existsSync, readDeviceId = (directory) => fs.statSync(directory).dev) {
|
|
204
|
+
if (!containerMarkerFiles.some(checkIsPresent))
|
|
205
|
+
return false;
|
|
206
|
+
const nearest = findNearestExistingDirectory(filePath);
|
|
207
|
+
if ('errorCode' in nearest)
|
|
208
|
+
return false;
|
|
209
|
+
try {
|
|
210
|
+
return readDeviceId(nearest.directory) === readDeviceId(rootDirectory);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=configDirFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configDirFile.js","sourceRoot":"","sources":["../src/configDirFile.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,oCAEC;AAGD,gDAEC;AAoBD,oDAGC;AAiDD,wDAgDC;AAOD,0DAUC;AAuBD,0DASC;AAYD,4EAaC;AA3ND,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAC7B,+CAA2D;AAE3D;;;;;;;;GAQG;AAEH,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAEnC,yHAAyH;AACzH,SAAgB,YAAY,CAAC,KAAY;IACvC,OAAO,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC3F,CAAC;AAED,yGAAyG;AACzG,SAAgB,kBAAkB,CAAC,MAAe;IAChD,OAAO,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,OAAe;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,oBAAoB,CAAC,QAAgB,EAAE,MAAyB,OAAO,CAAC,GAAG,EAAE,UAAkB,EAAE,CAAC,OAAO,EAAE;IACzH,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,IAAI,IAAA,wCAA0B,EAAC,OAAO,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC;AA0CD,gGAAgG;AAChG,SAAS,oBAAoB,CAAC,KAAY;IACxC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtD,OAAO,QAAQ,CAAC,CAAC,CAAC,iBAAiB,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,8GAA8G;AAC9G,SAAgB,sBAAsB,CAAU,OAAyC;IACvF,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACpD,MAAM,WAAW,GAAG,IAAI,GAAG,EAA+B,CAAC;IAE3D,SAAS,SAAS,CAAC,IAAY;QAC7B,IAAI,MAAiB,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,sGAAsG;YACtG,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,QAAQ,qBAAqB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACtH,CAAC;QACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,QAAQ,0BAA0B,CAAC,EAAE,CAAC;QACxE,CAAC;QACD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO;QACL,IAAI,CAAC,QAAQ;YACX,IAAI,IAAc,CAAC;YACnB,IAAI,CAAC;gBACH,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC7B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC;YACtD,CAAC;YACD,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACzD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,MAAM,EAAE,KAAK,KAAK,KAAK;gBAAE,OAAO,MAAM,CAAC,IAAI,CAAC;YAEhD,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC;YAC1C,IAAI,MAAiC,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YACxD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,QAAQ,uBAAuB,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/F,CAAC;YACD,MAAM,IAAI,GAA4B,MAAM,CAAC,EAAE;gBAC7C,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;gBACzC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;YACnE,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3F,OAAO,IAAI,CAAC;QACd,CAAC;QACD,UAAU;YACR,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,uBAAuB,CAAC,QAAgB,EAAE,KAAa,EAAE,QAAgB;IACvF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IAClD,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtF,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,sIAAsI;AACtI,SAAS,4BAA4B,CAAC,QAAgB;IACpD,IAAI,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,SAAS,CAAC;QACR,IAAI,CAAC;YACH,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACvB,OAAO,EAAE,SAAS,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACvC,IAAI,IAAI,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC1E,SAAS,GAAG,MAAM,CAAC;QACrB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,uBAAuB,CAAC,QAAgB;IACtD,MAAM,OAAO,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,WAAW,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC,SAAS,CAAC;IACrD,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpD,OAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,2FAA2F;AAC3F,MAAM,oBAAoB,GAAsB,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;AACtF,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B;;;;;GAKG;AACH,SAAgB,gCAAgC,CAC9C,QAAgB,EAChB,iBAAiD,EAAE,CAAC,UAAU,EAC9D,eAA8C,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAG;IAEvF,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,MAAM,OAAO,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,WAAW,IAAI,OAAO;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,YAAY,CAAC,aAAa,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -15,8 +15,8 @@ export declare function appendAutoContinueLimitsHint(noticeText: string): string
|
|
|
15
15
|
* cancels, and the request wake-up engine, which exists only after the boot built it.
|
|
16
16
|
*/
|
|
17
17
|
export interface AutoContinueLimitsPorts extends Pick<BotCore, 'bot' | 'command' | 'getState' | 'replyToThread' | 'authoriseContext' | 'withThreadLocale' | 'checkIsGeneral'> {
|
|
18
|
-
/** Open the `/
|
|
19
|
-
|
|
18
|
+
/** Open the `/limits_autoswitch` screen in the topic (the bare alias lands there). */
|
|
19
|
+
openAutoSwitchView: (key: SessionKey) => Promise<void>;
|
|
20
20
|
getArmedLimitRetryFireAt: (key: SessionKey) => number | null;
|
|
21
21
|
cancelApiRetry: (key: SessionKey) => void;
|
|
22
22
|
getRequestWakeUpEngine: () => Pick<RequestWakeUpEngine, 'stopWakingForLimitWait'> | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autoContinueLimits.d.ts","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/autoContinueLimits.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED;;;GAGG;AACH,MAAM,WAAW,uBACf,SAAQ,IAAI,CACV,OAAO,EACP,KAAK,GAAG,SAAS,GAAG,UAAU,GAAG,eAAe,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,gBAAgB,CAC9G;IACD,
|
|
1
|
+
{"version":3,"file":"autoContinueLimits.d.ts","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/autoContinueLimits.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED;;;GAGG;AACH,MAAM,WAAW,uBACf,SAAQ,IAAI,CACV,OAAO,EACP,KAAK,GAAG,SAAS,GAAG,UAAU,GAAG,eAAe,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,gBAAgB,CAC9G;IACD,sFAAsF;IACtF,kBAAkB,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,wBAAwB,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,MAAM,GAAG,IAAI,CAAC;IAC7D,cAAc,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,sBAAsB,EAAE,MAAM,IAAI,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,GAAG,IAAI,CAAC;CAC1F;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,uBAAuB;mCAezB,UAAU,aAAa,OAAO,WAAW,OAAO,GAAG,IAAI,KAAG,OAAO,CAAC,MAAM,CAAC;2CAyBjE,UAAU,SAAS,OAAO,GAAG,SAAS,QAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;8CAqBzE,IAAI;+CAeH,IAAI;EAYrD"}
|
|
@@ -21,7 +21,7 @@ function appendAutoContinueLimitsHint(noticeText) {
|
|
|
21
21
|
* notice's own buttons call, and the `register…()` calls.
|
|
22
22
|
*/
|
|
23
23
|
function createAutoContinueLimits(ports) {
|
|
24
|
-
const {
|
|
24
|
+
const { openAutoSwitchView, getArmedLimitRetryFireAt, cancelApiRetry, getRequestWakeUpEngine, bot, command, getState, replyToThread, authoriseContext, withThreadLocale, checkIsGeneral } = ports;
|
|
25
25
|
/**
|
|
26
26
|
* @description Apply the `/auto_continue_limits` setting and RETURN the
|
|
27
27
|
* confirmation text — the single write path behind the command and its picker
|
|
@@ -85,8 +85,8 @@ function createAutoContinueLimits(ports) {
|
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
87
|
function registerAutoContinueLimitsCommands() {
|
|
88
|
-
// `/auto_continue_limits` — hidden alias of `/
|
|
89
|
-
// per-thread override; General → the instance-wide default); bare opens the `/
|
|
88
|
+
// `/auto_continue_limits` — hidden alias of `/limits_autoswitch`. `on` / `off` set the setting (regular topic →
|
|
89
|
+
// per-thread override; General → the instance-wide default); bare opens the `/limits_autoswitch` screen. Deliberately
|
|
90
90
|
// NOT gated on an adapter/session: a limit can hit any topic at any time, and the operator must be able to
|
|
91
91
|
// set the preference before that.
|
|
92
92
|
command('auto_continue_limits', async (ctx, key) => {
|
|
@@ -95,7 +95,7 @@ function createAutoContinueLimits(ports) {
|
|
|
95
95
|
await replyToThread(key, await applyAutoContinueLimits(key, checkIsGeneral(key), arg === 'on'));
|
|
96
96
|
return;
|
|
97
97
|
}
|
|
98
|
-
await
|
|
98
|
+
await openAutoSwitchView(key);
|
|
99
99
|
});
|
|
100
100
|
}
|
|
101
101
|
function registerAutoContinueLimitsCallbacks() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autoContinueLimits.js","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/autoContinueLimits.ts"],"names":[],"mappings":";;AAuBA,oEAEC;AAsBD,4DAwFC;AA9HD,wDAAuD;AACvD,sDAAmD;AACnD,wCAAkC;AAClC,sEAAoF;AAIpF;;;;;;GAMG;AACH,SAAgB,4BAA4B,CAAC,UAAkB;IAC7D,OAAO,GAAG,UAAU,OAAO,IAAA,QAAC,EAAC,+BAA+B,CAAC,EAAE,CAAC;AAClE,CAAC;AAkBD;;;GAGG;AACH,SAAgB,wBAAwB,CAAC,KAA8B;IACrE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"autoContinueLimits.js","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/autoContinueLimits.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SessionKey } from '../../../sessionKey';
|
|
2
|
+
import { type BackendFamily, type BackendSwitchTarget } from '../../../utils/backendSwitchPlan';
|
|
3
|
+
import type { BotCore } from './botCore';
|
|
4
|
+
/** What the question needs from the bot: the shared core, the topic's backend now, and the switch itself. */
|
|
5
|
+
export interface BackendSwitchPorts extends Pick<BotCore, 'bot' | 'replyToThread' | 'editThreadMessage' | 'authoriseContext' | 'withThreadLocale'> {
|
|
6
|
+
/** The backend family the topic's agent runs on now; `null` for no agent, a shell or an unknown name. */
|
|
7
|
+
getCurrentFamily: (key: SessionKey) => BackendFamily | null;
|
|
8
|
+
/**
|
|
9
|
+
* Make the switch the operator confirmed: move the topic to `target` and hand the conversation over (the context
|
|
10
|
+
* bridge is the new agent's first prompt). `userMessage` is the text typed with the command (`/opencode do X`).
|
|
11
|
+
*/
|
|
12
|
+
performBackendSwitch: (key: SessionKey, target: BackendSwitchTarget, options: {
|
|
13
|
+
userMessage?: string;
|
|
14
|
+
}) => Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
/** @description Build the question and its buttons over their ports. */
|
|
17
|
+
export declare function createBackendSwitch(ports: BackendSwitchPorts): {
|
|
18
|
+
askBackendSwitch: (key: SessionKey, request: {
|
|
19
|
+
from: BackendFamily;
|
|
20
|
+
target: BackendSwitchTarget;
|
|
21
|
+
userMessage?: string;
|
|
22
|
+
}) => Promise<void>;
|
|
23
|
+
registerBackendSwitchCallbacks: () => void;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=backendSwitch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backendSwitch.d.ts","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/backendSwitch.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAOL,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACzB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,6GAA6G;AAC7G,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,eAAe,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;IAC9G,yGAAyG;IACzG,gBAAgB,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,aAAa,GAAG,IAAI,CAAC;IAC5D;;;OAGG;IACH,oBAAoB,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1H;AAUD,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB;4BAkBtB,UAAU,WAAW;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,mBAAmB,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KAAG,OAAO,CAAC,IAAI,CAAC;0CA0BzG,IAAI;EAiChD"}
|