charness 3.2.0 → 3.3.1

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.
Files changed (313) hide show
  1. package/.env.example +3 -6
  2. package/DEVELOPMENT.md +15 -0
  3. package/README.md +111 -38
  4. package/SETUP.md +121 -16
  5. package/dist/adapters/adapterEventRouting.d.ts +2 -1
  6. package/dist/adapters/adapterEventRouting.d.ts.map +1 -1
  7. package/dist/adapters/adapterEventRouting.js +3 -0
  8. package/dist/adapters/adapterEventRouting.js.map +1 -1
  9. package/dist/adapters/adapterNames.d.ts +13 -0
  10. package/dist/adapters/adapterNames.d.ts.map +1 -1
  11. package/dist/adapters/adapterNames.js +16 -0
  12. package/dist/adapters/adapterNames.js.map +1 -1
  13. package/dist/adapters/backendUnavailableError.d.ts +11 -0
  14. package/dist/adapters/backendUnavailableError.d.ts.map +1 -0
  15. package/dist/adapters/backendUnavailableError.js +19 -0
  16. package/dist/adapters/backendUnavailableError.js.map +1 -0
  17. package/dist/adapters/claudeCliAdapter.d.ts +29 -6
  18. package/dist/adapters/claudeCliAdapter.d.ts.map +1 -1
  19. package/dist/adapters/claudeCliAdapter.js +70 -16
  20. package/dist/adapters/claudeCliAdapter.js.map +1 -1
  21. package/dist/adapters/claudeJsonStreamAdapter.d.ts +36 -3
  22. package/dist/adapters/claudeJsonStreamAdapter.d.ts.map +1 -1
  23. package/dist/adapters/claudeJsonStreamAdapter.js +93 -30
  24. package/dist/adapters/claudeJsonStreamAdapter.js.map +1 -1
  25. package/dist/adapters/createAdapter.d.ts +3 -14
  26. package/dist/adapters/createAdapter.d.ts.map +1 -1
  27. package/dist/adapters/createAdapter.js +9 -19
  28. package/dist/adapters/createAdapter.js.map +1 -1
  29. package/dist/adapters/openCodeAdapter.d.ts +140 -12
  30. package/dist/adapters/openCodeAdapter.d.ts.map +1 -1
  31. package/dist/adapters/openCodeAdapter.js +385 -119
  32. package/dist/adapters/openCodeAdapter.js.map +1 -1
  33. package/dist/apiErrorRetry.d.ts +70 -6
  34. package/dist/apiErrorRetry.d.ts.map +1 -1
  35. package/dist/apiErrorRetry.js +312 -34
  36. package/dist/apiErrorRetry.js.map +1 -1
  37. package/dist/apiRetryKick.d.ts +26 -1
  38. package/dist/apiRetryKick.d.ts.map +1 -1
  39. package/dist/apiRetryKick.js +41 -2
  40. package/dist/apiRetryKick.js.map +1 -1
  41. package/dist/bot.d.ts +2 -1
  42. package/dist/bot.d.ts.map +1 -1
  43. package/dist/bot.js +736 -184
  44. package/dist/bot.js.map +1 -1
  45. package/dist/cli/claudeProfiles.d.ts +1 -1
  46. package/dist/cli/claudeProfiles.js +1 -1
  47. package/dist/cli/hot.d.ts +7 -1
  48. package/dist/cli/hot.d.ts.map +1 -1
  49. package/dist/cli/hot.js +29 -3
  50. package/dist/cli/hot.js.map +1 -1
  51. package/dist/configDirFile.d.ts +73 -0
  52. package/dist/configDirFile.d.ts.map +1 -0
  53. package/dist/configDirFile.js +216 -0
  54. package/dist/configDirFile.js.map +1 -0
  55. package/dist/connectors/telegram/commands/autoContinueLimits.d.ts +2 -2
  56. package/dist/connectors/telegram/commands/autoContinueLimits.d.ts.map +1 -1
  57. package/dist/connectors/telegram/commands/autoContinueLimits.js +4 -4
  58. package/dist/connectors/telegram/commands/autoContinueLimits.js.map +1 -1
  59. package/dist/connectors/telegram/commands/backendSwitch.d.ts +25 -0
  60. package/dist/connectors/telegram/commands/backendSwitch.d.ts.map +1 -0
  61. package/dist/connectors/telegram/commands/backendSwitch.js +104 -0
  62. package/dist/connectors/telegram/commands/backendSwitch.js.map +1 -0
  63. package/dist/connectors/telegram/commands/callbackMessage.d.ts +12 -0
  64. package/dist/connectors/telegram/commands/callbackMessage.d.ts.map +1 -1
  65. package/dist/connectors/telegram/commands/callbackMessage.js +24 -0
  66. package/dist/connectors/telegram/commands/callbackMessage.js.map +1 -1
  67. package/dist/connectors/telegram/commands/callbackToast.d.ts +36 -0
  68. package/dist/connectors/telegram/commands/callbackToast.d.ts.map +1 -0
  69. package/dist/connectors/telegram/commands/callbackToast.js +83 -0
  70. package/dist/connectors/telegram/commands/callbackToast.js.map +1 -0
  71. package/dist/connectors/telegram/commands/claudeAccounts.d.ts +18 -0
  72. package/dist/connectors/telegram/commands/claudeAccounts.d.ts.map +1 -1
  73. package/dist/connectors/telegram/commands/claudeAccounts.js +220 -66
  74. package/dist/connectors/telegram/commands/claudeAccounts.js.map +1 -1
  75. package/dist/connectors/telegram/commands/displayModes.d.ts.map +1 -1
  76. package/dist/connectors/telegram/commands/displayModes.js +4 -2
  77. package/dist/connectors/telegram/commands/displayModes.js.map +1 -1
  78. package/dist/connectors/telegram/commands/fallbackChain.d.ts +5 -8
  79. package/dist/connectors/telegram/commands/fallbackChain.d.ts.map +1 -1
  80. package/dist/connectors/telegram/commands/fallbackChain.js +183 -193
  81. package/dist/connectors/telegram/commands/fallbackChain.js.map +1 -1
  82. package/dist/connectors/telegram/commands/limitsBoard.d.ts +40 -0
  83. package/dist/connectors/telegram/commands/limitsBoard.d.ts.map +1 -0
  84. package/dist/connectors/telegram/commands/limitsBoard.js +281 -0
  85. package/dist/connectors/telegram/commands/limitsBoard.js.map +1 -0
  86. package/dist/connectors/telegram/commands/modelPage.d.ts +130 -0
  87. package/dist/connectors/telegram/commands/modelPage.d.ts.map +1 -0
  88. package/dist/connectors/telegram/commands/modelPage.js +120 -0
  89. package/dist/connectors/telegram/commands/modelPage.js.map +1 -0
  90. package/dist/connectors/telegram/commands/modelProviders.d.ts +9 -1
  91. package/dist/connectors/telegram/commands/modelProviders.d.ts.map +1 -1
  92. package/dist/connectors/telegram/commands/modelProviders.js +203 -111
  93. package/dist/connectors/telegram/commands/modelProviders.js.map +1 -1
  94. package/dist/connectors/telegram/commands/stt.d.ts +32 -0
  95. package/dist/connectors/telegram/commands/stt.d.ts.map +1 -0
  96. package/dist/connectors/telegram/commands/stt.js +460 -0
  97. package/dist/connectors/telegram/commands/stt.js.map +1 -0
  98. package/dist/effortLevels.d.ts +57 -7
  99. package/dist/effortLevels.d.ts.map +1 -1
  100. package/dist/effortLevels.js +65 -9
  101. package/dist/effortLevels.js.map +1 -1
  102. package/dist/i18n/de.d.ts.map +1 -1
  103. package/dist/i18n/de.js +160 -17
  104. package/dist/i18n/de.js.map +1 -1
  105. package/dist/i18n/en.d.ts.map +1 -1
  106. package/dist/i18n/en.js +160 -17
  107. package/dist/i18n/en.js.map +1 -1
  108. package/dist/i18n/es.d.ts.map +1 -1
  109. package/dist/i18n/es.js +160 -17
  110. package/dist/i18n/es.js.map +1 -1
  111. package/dist/i18n/fr.d.ts.map +1 -1
  112. package/dist/i18n/fr.js +160 -17
  113. package/dist/i18n/fr.js.map +1 -1
  114. package/dist/i18n/hi.d.ts.map +1 -1
  115. package/dist/i18n/hi.js +160 -17
  116. package/dist/i18n/hi.js.map +1 -1
  117. package/dist/i18n/ja.d.ts.map +1 -1
  118. package/dist/i18n/ja.js +160 -17
  119. package/dist/i18n/ja.js.map +1 -1
  120. package/dist/i18n/ka.d.ts.map +1 -1
  121. package/dist/i18n/ka.js +160 -17
  122. package/dist/i18n/ka.js.map +1 -1
  123. package/dist/i18n/pt.d.ts.map +1 -1
  124. package/dist/i18n/pt.js +160 -17
  125. package/dist/i18n/pt.js.map +1 -1
  126. package/dist/i18n/ru.d.ts.map +1 -1
  127. package/dist/i18n/ru.js +160 -17
  128. package/dist/i18n/ru.js.map +1 -1
  129. package/dist/i18n/uk.d.ts.map +1 -1
  130. package/dist/i18n/uk.js +160 -17
  131. package/dist/i18n/uk.js.map +1 -1
  132. package/dist/i18n/uz.d.ts.map +1 -1
  133. package/dist/i18n/uz.js +160 -17
  134. package/dist/i18n/uz.js.map +1 -1
  135. package/dist/i18n/zh.d.ts.map +1 -1
  136. package/dist/i18n/zh.js +160 -17
  137. package/dist/i18n/zh.js.map +1 -1
  138. package/dist/installManager.d.ts +20 -4
  139. package/dist/installManager.d.ts.map +1 -1
  140. package/dist/installManager.js +82 -14
  141. package/dist/installManager.js.map +1 -1
  142. package/dist/instanceSettings.d.ts +52 -0
  143. package/dist/instanceSettings.d.ts.map +1 -0
  144. package/dist/instanceSettings.js +136 -0
  145. package/dist/instanceSettings.js.map +1 -0
  146. package/dist/pinnedStatus.d.ts +7 -1
  147. package/dist/pinnedStatus.d.ts.map +1 -1
  148. package/dist/pinnedStatus.js +1 -1
  149. package/dist/pinnedStatus.js.map +1 -1
  150. package/dist/requests/requestLedger.d.ts +8 -0
  151. package/dist/requests/requestLedger.d.ts.map +1 -1
  152. package/dist/requests/requestLedger.js +19 -1
  153. package/dist/requests/requestLedger.js.map +1 -1
  154. package/dist/scheduler/mcpSurface.js +4 -4
  155. package/dist/scheduler/mcpSurface.js.map +1 -1
  156. package/dist/shutdown.d.ts +14 -0
  157. package/dist/shutdown.d.ts.map +1 -1
  158. package/dist/shutdown.js +16 -0
  159. package/dist/shutdown.js.map +1 -1
  160. package/dist/state.d.ts +54 -2
  161. package/dist/state.d.ts.map +1 -1
  162. package/dist/state.js +62 -1
  163. package/dist/state.js.map +1 -1
  164. package/dist/stt/sttAutoInstall.d.ts +39 -0
  165. package/dist/stt/sttAutoInstall.d.ts.map +1 -0
  166. package/dist/stt/sttAutoInstall.js +158 -0
  167. package/dist/stt/sttAutoInstall.js.map +1 -0
  168. package/dist/stt/sttChildEnv.d.ts +11 -0
  169. package/dist/stt/sttChildEnv.d.ts.map +1 -0
  170. package/dist/stt/sttChildEnv.js +30 -0
  171. package/dist/stt/sttChildEnv.js.map +1 -0
  172. package/dist/stt/sttConfigEdit.d.ts +71 -0
  173. package/dist/stt/sttConfigEdit.d.ts.map +1 -0
  174. package/dist/stt/sttConfigEdit.js +144 -0
  175. package/dist/stt/sttConfigEdit.js.map +1 -0
  176. package/dist/stt/sttInstall.d.ts +147 -0
  177. package/dist/stt/sttInstall.d.ts.map +1 -0
  178. package/dist/stt/sttInstall.js +491 -0
  179. package/dist/stt/sttInstall.js.map +1 -0
  180. package/dist/stt/sttInstallEntry.d.ts +2 -0
  181. package/dist/stt/sttInstallEntry.d.ts.map +1 -0
  182. package/dist/stt/sttInstallEntry.js +31 -0
  183. package/dist/stt/sttInstallEntry.js.map +1 -0
  184. package/dist/stt/sttInstallReporter.d.ts +45 -0
  185. package/dist/stt/sttInstallReporter.d.ts.map +1 -0
  186. package/dist/stt/sttInstallReporter.js +57 -0
  187. package/dist/stt/sttInstallReporter.js.map +1 -0
  188. package/dist/stt/sttRuntime.d.ts +35 -0
  189. package/dist/stt/sttRuntime.d.ts.map +1 -0
  190. package/dist/stt/sttRuntime.js +73 -0
  191. package/dist/stt/sttRuntime.js.map +1 -0
  192. package/dist/stt/sttScreenPlan.d.ts +193 -0
  193. package/dist/stt/sttScreenPlan.d.ts.map +1 -0
  194. package/dist/stt/sttScreenPlan.js +541 -0
  195. package/dist/stt/sttScreenPlan.js.map +1 -0
  196. package/dist/stt/sttSettings.d.ts +201 -0
  197. package/dist/stt/sttSettings.d.ts.map +1 -0
  198. package/dist/stt/sttSettings.js +387 -0
  199. package/dist/stt/sttSettings.js.map +1 -0
  200. package/dist/stt/sttSidecarOwner.d.ts +115 -0
  201. package/dist/stt/sttSidecarOwner.d.ts.map +1 -0
  202. package/dist/stt/sttSidecarOwner.js +475 -0
  203. package/dist/stt/sttSidecarOwner.js.map +1 -0
  204. package/dist/stt/transcribeChain.d.ts +36 -0
  205. package/dist/stt/transcribeChain.d.ts.map +1 -0
  206. package/dist/stt/transcribeChain.js +42 -0
  207. package/dist/stt/transcribeChain.js.map +1 -0
  208. package/dist/types.d.ts +77 -4
  209. package/dist/types.d.ts.map +1 -1
  210. package/dist/utils/adapterSwitchSessionIds.d.ts +32 -0
  211. package/dist/utils/adapterSwitchSessionIds.d.ts.map +1 -0
  212. package/dist/utils/adapterSwitchSessionIds.js +44 -0
  213. package/dist/utils/adapterSwitchSessionIds.js.map +1 -0
  214. package/dist/utils/backendSwitchPlan.d.ts +63 -0
  215. package/dist/utils/backendSwitchPlan.d.ts.map +1 -0
  216. package/dist/utils/backendSwitchPlan.js +73 -0
  217. package/dist/utils/backendSwitchPlan.js.map +1 -0
  218. package/dist/utils/claudeAccountPickerPlan.d.ts +12 -1
  219. package/dist/utils/claudeAccountPickerPlan.d.ts.map +1 -1
  220. package/dist/utils/claudeAccountPickerPlan.js +20 -1
  221. package/dist/utils/claudeAccountPickerPlan.js.map +1 -1
  222. package/dist/utils/claudeTranscriptContent.d.ts +24 -0
  223. package/dist/utils/claudeTranscriptContent.d.ts.map +1 -0
  224. package/dist/utils/claudeTranscriptContent.js +107 -0
  225. package/dist/utils/claudeTranscriptContent.js.map +1 -0
  226. package/dist/utils/claudeUsage.d.ts +47 -8
  227. package/dist/utils/claudeUsage.d.ts.map +1 -1
  228. package/dist/utils/claudeUsage.js +76 -14
  229. package/dist/utils/claudeUsage.js.map +1 -1
  230. package/dist/utils/claudeUsageRefresher.d.ts +8 -1
  231. package/dist/utils/claudeUsageRefresher.d.ts.map +1 -1
  232. package/dist/utils/claudeUsageRefresher.js +9 -4
  233. package/dist/utils/claudeUsageRefresher.js.map +1 -1
  234. package/dist/utils/effortPickerPlan.d.ts +54 -0
  235. package/dist/utils/effortPickerPlan.d.ts.map +1 -0
  236. package/dist/utils/effortPickerPlan.js +56 -0
  237. package/dist/utils/effortPickerPlan.js.map +1 -0
  238. package/dist/utils/ensureSessionPlan.d.ts +20 -4
  239. package/dist/utils/ensureSessionPlan.d.ts.map +1 -1
  240. package/dist/utils/ensureSessionPlan.js +17 -4
  241. package/dist/utils/ensureSessionPlan.js.map +1 -1
  242. package/dist/utils/fallbackBridge.d.ts +6 -2
  243. package/dist/utils/fallbackBridge.d.ts.map +1 -1
  244. package/dist/utils/fallbackBridge.js +10 -3
  245. package/dist/utils/fallbackBridge.js.map +1 -1
  246. package/dist/utils/fallbackChain.d.ts +36 -0
  247. package/dist/utils/fallbackChain.d.ts.map +1 -1
  248. package/dist/utils/fallbackChain.js +65 -1
  249. package/dist/utils/fallbackChain.js.map +1 -1
  250. package/dist/utils/fallbackSwitchNotice.d.ts +41 -0
  251. package/dist/utils/fallbackSwitchNotice.d.ts.map +1 -0
  252. package/dist/utils/fallbackSwitchNotice.js +75 -0
  253. package/dist/utils/fallbackSwitchNotice.js.map +1 -0
  254. package/dist/utils/fileSendService.d.ts +33 -10
  255. package/dist/utils/fileSendService.d.ts.map +1 -1
  256. package/dist/utils/fileSendService.js +78 -27
  257. package/dist/utils/fileSendService.js.map +1 -1
  258. package/dist/utils/jsonStreamHost.d.ts +39 -0
  259. package/dist/utils/jsonStreamHost.d.ts.map +1 -1
  260. package/dist/utils/jsonStreamHost.js +60 -1
  261. package/dist/utils/jsonStreamHost.js.map +1 -1
  262. package/dist/utils/limitEpisodeRecovery.d.ts +16 -2
  263. package/dist/utils/limitEpisodeRecovery.d.ts.map +1 -1
  264. package/dist/utils/limitEpisodeRecovery.js +44 -3
  265. package/dist/utils/limitEpisodeRecovery.js.map +1 -1
  266. package/dist/utils/limitSettings.d.ts +25 -0
  267. package/dist/utils/limitSettings.d.ts.map +1 -0
  268. package/dist/utils/limitSettings.js +31 -0
  269. package/dist/utils/limitSettings.js.map +1 -0
  270. package/dist/utils/limitsBoardPlan.d.ts +52 -0
  271. package/dist/utils/limitsBoardPlan.d.ts.map +1 -0
  272. package/dist/utils/limitsBoardPlan.js +93 -0
  273. package/dist/utils/limitsBoardPlan.js.map +1 -0
  274. package/dist/utils/openCodeUsage.d.ts +93 -0
  275. package/dist/utils/openCodeUsage.d.ts.map +1 -0
  276. package/dist/utils/openCodeUsage.js +248 -0
  277. package/dist/utils/openCodeUsage.js.map +1 -0
  278. package/dist/utils/operatorSwitchPlan.d.ts +61 -0
  279. package/dist/utils/operatorSwitchPlan.d.ts.map +1 -0
  280. package/dist/utils/operatorSwitchPlan.js +32 -0
  281. package/dist/utils/operatorSwitchPlan.js.map +1 -0
  282. package/dist/utils/promptDelivery.d.ts +40 -0
  283. package/dist/utils/promptDelivery.d.ts.map +1 -1
  284. package/dist/utils/promptDelivery.js +31 -0
  285. package/dist/utils/promptDelivery.js.map +1 -1
  286. package/dist/utils/recvPreviewRedaction.d.ts +14 -4
  287. package/dist/utils/recvPreviewRedaction.d.ts.map +1 -1
  288. package/dist/utils/recvPreviewRedaction.js +19 -7
  289. package/dist/utils/recvPreviewRedaction.js.map +1 -1
  290. package/dist/utils/startupReadiness.d.ts +3 -3
  291. package/dist/utils/startupReadiness.d.ts.map +1 -1
  292. package/dist/utils/startupReadiness.js +2 -2
  293. package/dist/utils/startupReadiness.js.map +1 -1
  294. package/dist/utils/threadStatusReport.d.ts +3 -1
  295. package/dist/utils/threadStatusReport.d.ts.map +1 -1
  296. package/dist/utils/threadStatusReport.js +4 -3
  297. package/dist/utils/threadStatusReport.js.map +1 -1
  298. package/dist/utils/timezone.d.ts +23 -0
  299. package/dist/utils/timezone.d.ts.map +1 -1
  300. package/dist/utils/timezone.js +38 -0
  301. package/dist/utils/timezone.js.map +1 -1
  302. package/dist/utils/transcribeAudio.d.ts +25 -12
  303. package/dist/utils/transcribeAudio.d.ts.map +1 -1
  304. package/dist/utils/transcribeAudio.js +39 -21
  305. package/dist/utils/transcribeAudio.js.map +1 -1
  306. package/dist/utils/usageRefreshBudget.d.ts +9 -0
  307. package/dist/utils/usageRefreshBudget.d.ts.map +1 -0
  308. package/dist/utils/usageRefreshBudget.js +27 -0
  309. package/dist/utils/usageRefreshBudget.js.map +1 -0
  310. package/examples/.env.example +7 -3
  311. package/examples/docker-compose.yml +9 -7
  312. package/package.json +5 -4
  313. 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
@@ -1 +1 @@
1
- {"version":3,"file":"hot.d.ts","sourceRoot":"","sources":["../../src/cli/hot.ts"],"names":[],"mappings":"AAiBA,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAiK5C;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,GAChB,MAAM,CAAC,UAAU,CAQnB"}
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
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"hot.js","sourceRoot":"","sources":["../../src/cli/hot.ts"],"names":[],"mappings":"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"}
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":"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"}
@@ -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 `/limits` screen in the topic (the bare alias lands there). */
19
- openLimitsView: (key: SessionKey) => Promise<void>;
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,2EAA2E;IAC3E,cAAc,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,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"}
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 { openLimitsView, getArmedLimitRetryFireAt, cancelApiRetry, getRequestWakeUpEngine, bot, command, getState, replyToThread, authoriseContext, withThreadLocale, checkIsGeneral } = ports;
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 `/limits`. `on` / `off` set the setting (regular topic →
89
- // per-thread override; General → the instance-wide default); bare opens the `/limits` screen. Deliberately
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 openLimitsView(key);
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":"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"}
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"}