charness 3.4.0 → 3.6.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.
Files changed (231) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/DEVELOPMENT.md +12 -1
  3. package/README.md +89 -6
  4. package/SETUP.md +199 -1
  5. package/dist/adapters/adapterEventRouting.d.ts +2 -2
  6. package/dist/adapters/adapterEventRouting.d.ts.map +1 -1
  7. package/dist/adapters/adapterEventRouting.js +4 -3
  8. package/dist/adapters/adapterEventRouting.js.map +1 -1
  9. package/dist/adapters/claudeCliAdapter.js +2 -2
  10. package/dist/adapters/claudeCliAdapter.js.map +1 -1
  11. package/dist/adapters/claudeConfigDir.d.ts +18 -0
  12. package/dist/adapters/claudeConfigDir.d.ts.map +1 -1
  13. package/dist/adapters/claudeJsonStreamAdapter.d.ts +82 -6
  14. package/dist/adapters/claudeJsonStreamAdapter.d.ts.map +1 -1
  15. package/dist/adapters/claudeJsonStreamAdapter.js +211 -14
  16. package/dist/adapters/claudeJsonStreamAdapter.js.map +1 -1
  17. package/dist/adapters/createAdapter.d.ts +14 -1
  18. package/dist/adapters/createAdapter.d.ts.map +1 -1
  19. package/dist/adapters/createAdapter.js +54 -2
  20. package/dist/adapters/createAdapter.js.map +1 -1
  21. package/dist/adapters/openCodeAdapter.d.ts +5 -0
  22. package/dist/adapters/openCodeAdapter.d.ts.map +1 -1
  23. package/dist/adapters/openCodeAdapter.js +7 -0
  24. package/dist/adapters/openCodeAdapter.js.map +1 -1
  25. package/dist/agentLogin/agentLogin.d.ts +18 -1
  26. package/dist/agentLogin/agentLogin.d.ts.map +1 -1
  27. package/dist/agentLogin/agentLogin.js +59 -18
  28. package/dist/agentLogin/agentLogin.js.map +1 -1
  29. package/dist/apiErrorRetry.d.ts +3 -1
  30. package/dist/apiErrorRetry.d.ts.map +1 -1
  31. package/dist/apiErrorRetry.js +11 -1
  32. package/dist/apiErrorRetry.js.map +1 -1
  33. package/dist/bot.d.ts.map +1 -1
  34. package/dist/bot.js +475 -105
  35. package/dist/bot.js.map +1 -1
  36. package/dist/cli/claudeProfiles.d.ts +1 -1
  37. package/dist/cli/claudeProfiles.d.ts.map +1 -1
  38. package/dist/cli/claudeProfiles.js +11 -6
  39. package/dist/cli/claudeProfiles.js.map +1 -1
  40. package/dist/connectors/jira/connector.d.ts +2 -0
  41. package/dist/connectors/jira/connector.d.ts.map +1 -1
  42. package/dist/connectors/jira/connector.js +5 -4
  43. package/dist/connectors/jira/connector.js.map +1 -1
  44. package/dist/connectors/telegram/commands/claudeAccounts.d.ts +6 -2
  45. package/dist/connectors/telegram/commands/claudeAccounts.d.ts.map +1 -1
  46. package/dist/connectors/telegram/commands/claudeAccounts.js +127 -28
  47. package/dist/connectors/telegram/commands/claudeAccounts.js.map +1 -1
  48. package/dist/connectors/telegram/commands/compaction.d.ts.map +1 -1
  49. package/dist/connectors/telegram/commands/compaction.js +39 -8
  50. package/dist/connectors/telegram/commands/compaction.js.map +1 -1
  51. package/dist/connectors/telegram/commands/fallbackChain.d.ts.map +1 -1
  52. package/dist/connectors/telegram/commands/fallbackChain.js +6 -2
  53. package/dist/connectors/telegram/commands/fallbackChain.js.map +1 -1
  54. package/dist/connectors/telegram/forumTopicCreated.d.ts +20 -0
  55. package/dist/connectors/telegram/forumTopicCreated.d.ts.map +1 -0
  56. package/dist/connectors/telegram/forumTopicCreated.js +16 -0
  57. package/dist/connectors/telegram/forumTopicCreated.js.map +1 -0
  58. package/dist/i18n/de.d.ts.map +1 -1
  59. package/dist/i18n/de.js +42 -1
  60. package/dist/i18n/de.js.map +1 -1
  61. package/dist/i18n/en.d.ts.map +1 -1
  62. package/dist/i18n/en.js +42 -1
  63. package/dist/i18n/en.js.map +1 -1
  64. package/dist/i18n/es.d.ts.map +1 -1
  65. package/dist/i18n/es.js +42 -1
  66. package/dist/i18n/es.js.map +1 -1
  67. package/dist/i18n/fr.d.ts.map +1 -1
  68. package/dist/i18n/fr.js +42 -1
  69. package/dist/i18n/fr.js.map +1 -1
  70. package/dist/i18n/hi.d.ts.map +1 -1
  71. package/dist/i18n/hi.js +42 -1
  72. package/dist/i18n/hi.js.map +1 -1
  73. package/dist/i18n/ja.d.ts.map +1 -1
  74. package/dist/i18n/ja.js +42 -1
  75. package/dist/i18n/ja.js.map +1 -1
  76. package/dist/i18n/ka.d.ts.map +1 -1
  77. package/dist/i18n/ka.js +42 -1
  78. package/dist/i18n/ka.js.map +1 -1
  79. package/dist/i18n/pt.d.ts.map +1 -1
  80. package/dist/i18n/pt.js +42 -1
  81. package/dist/i18n/pt.js.map +1 -1
  82. package/dist/i18n/ru.d.ts.map +1 -1
  83. package/dist/i18n/ru.js +42 -1
  84. package/dist/i18n/ru.js.map +1 -1
  85. package/dist/i18n/uk.d.ts.map +1 -1
  86. package/dist/i18n/uk.js +42 -1
  87. package/dist/i18n/uk.js.map +1 -1
  88. package/dist/i18n/uz.d.ts.map +1 -1
  89. package/dist/i18n/uz.js +42 -1
  90. package/dist/i18n/uz.js.map +1 -1
  91. package/dist/i18n/zh.d.ts.map +1 -1
  92. package/dist/i18n/zh.js +42 -1
  93. package/dist/i18n/zh.js.map +1 -1
  94. package/dist/i18n.d.ts +2 -0
  95. package/dist/i18n.d.ts.map +1 -1
  96. package/dist/i18n.js.map +1 -1
  97. package/dist/rateLimiter.d.ts +6 -0
  98. package/dist/rateLimiter.d.ts.map +1 -1
  99. package/dist/rateLimiter.js +9 -0
  100. package/dist/rateLimiter.js.map +1 -1
  101. package/dist/requests/wakeUpEngine.d.ts +4 -0
  102. package/dist/requests/wakeUpEngine.d.ts.map +1 -1
  103. package/dist/requests/wakeUpEngine.js +3 -3
  104. package/dist/requests/wakeUpEngine.js.map +1 -1
  105. package/dist/requests/wakeUpRules.d.ts +2 -1
  106. package/dist/requests/wakeUpRules.d.ts.map +1 -1
  107. package/dist/requests/wakeUpRules.js +3 -2
  108. package/dist/requests/wakeUpRules.js.map +1 -1
  109. package/dist/scheduler/mcpSurface.d.ts.map +1 -1
  110. package/dist/scheduler/mcpSurface.js +5 -3
  111. package/dist/scheduler/mcpSurface.js.map +1 -1
  112. package/dist/selfUpdate/updateMessages.d.ts +1 -1
  113. package/dist/selfUpdate/updateMessages.d.ts.map +1 -1
  114. package/dist/selfUpdate/updateMessages.js.map +1 -1
  115. package/dist/state.d.ts +67 -5
  116. package/dist/state.d.ts.map +1 -1
  117. package/dist/state.js +76 -7
  118. package/dist/state.js.map +1 -1
  119. package/dist/testTimings.d.ts +45 -0
  120. package/dist/testTimings.d.ts.map +1 -0
  121. package/dist/testTimings.js +89 -0
  122. package/dist/testTimings.js.map +1 -0
  123. package/dist/types.d.ts +49 -0
  124. package/dist/types.d.ts.map +1 -1
  125. package/dist/utils/adapterSwitchSessionIds.d.ts +5 -1
  126. package/dist/utils/adapterSwitchSessionIds.d.ts.map +1 -1
  127. package/dist/utils/adapterSwitchSessionIds.js +1 -1
  128. package/dist/utils/adapterSwitchSessionIds.js.map +1 -1
  129. package/dist/utils/adoptedToolList.d.ts +16 -21
  130. package/dist/utils/adoptedToolList.d.ts.map +1 -1
  131. package/dist/utils/adoptedToolList.js +18 -17
  132. package/dist/utils/adoptedToolList.js.map +1 -1
  133. package/dist/utils/anthropicApiKeyCheck.d.ts +19 -0
  134. package/dist/utils/anthropicApiKeyCheck.d.ts.map +1 -0
  135. package/dist/utils/anthropicApiKeyCheck.js +41 -0
  136. package/dist/utils/anthropicApiKeyCheck.js.map +1 -0
  137. package/dist/utils/claudeAccountPickerPlan.d.ts +6 -1
  138. package/dist/utils/claudeAccountPickerPlan.d.ts.map +1 -1
  139. package/dist/utils/claudeAccountPickerPlan.js +5 -1
  140. package/dist/utils/claudeAccountPickerPlan.js.map +1 -1
  141. package/dist/utils/claudeApiKeyHelper.d.ts +19 -0
  142. package/dist/utils/claudeApiKeyHelper.d.ts.map +1 -0
  143. package/dist/utils/claudeApiKeyHelper.js +32 -0
  144. package/dist/utils/claudeApiKeyHelper.js.map +1 -0
  145. package/dist/utils/claudeApiSpend.d.ts +73 -0
  146. package/dist/utils/claudeApiSpend.d.ts.map +1 -0
  147. package/dist/utils/claudeApiSpend.js +82 -0
  148. package/dist/utils/claudeApiSpend.js.map +1 -0
  149. package/dist/utils/claudeCompactHook.d.ts +11 -6
  150. package/dist/utils/claudeCompactHook.d.ts.map +1 -1
  151. package/dist/utils/claudeCompactHook.js +28 -11
  152. package/dist/utils/claudeCompactHook.js.map +1 -1
  153. package/dist/utils/claudeLimitSwitch.d.ts +2 -1
  154. package/dist/utils/claudeLimitSwitch.d.ts.map +1 -1
  155. package/dist/utils/claudeLimitSwitch.js +3 -2
  156. package/dist/utils/claudeLimitSwitch.js.map +1 -1
  157. package/dist/utils/claudeProfileUsageLines.d.ts +18 -3
  158. package/dist/utils/claudeProfileUsageLines.d.ts.map +1 -1
  159. package/dist/utils/claudeProfileUsageLines.js +23 -2
  160. package/dist/utils/claudeProfileUsageLines.js.map +1 -1
  161. package/dist/utils/claudeProfiles.d.ts +57 -2
  162. package/dist/utils/claudeProfiles.d.ts.map +1 -1
  163. package/dist/utils/claudeProfiles.js +96 -3
  164. package/dist/utils/claudeProfiles.js.map +1 -1
  165. package/dist/utils/claudeScheduledJobs.d.ts +49 -0
  166. package/dist/utils/claudeScheduledJobs.d.ts.map +1 -0
  167. package/dist/utils/claudeScheduledJobs.js +62 -0
  168. package/dist/utils/claudeScheduledJobs.js.map +1 -0
  169. package/dist/utils/claudeStreamJson.d.ts +35 -2
  170. package/dist/utils/claudeStreamJson.d.ts.map +1 -1
  171. package/dist/utils/claudeStreamJson.js +31 -8
  172. package/dist/utils/claudeStreamJson.js.map +1 -1
  173. package/dist/utils/claudeTranscriptContent.d.ts +8 -0
  174. package/dist/utils/claudeTranscriptContent.d.ts.map +1 -1
  175. package/dist/utils/claudeTranscriptContent.js +44 -0
  176. package/dist/utils/claudeTranscriptContent.js.map +1 -1
  177. package/dist/utils/claudeUsage.d.ts +22 -6
  178. package/dist/utils/claudeUsage.d.ts.map +1 -1
  179. package/dist/utils/claudeUsage.js +12 -5
  180. package/dist/utils/claudeUsage.js.map +1 -1
  181. package/dist/utils/claudeUsageRefresher.d.ts +6 -0
  182. package/dist/utils/claudeUsageRefresher.d.ts.map +1 -1
  183. package/dist/utils/claudeUsageRefresher.js +2 -2
  184. package/dist/utils/claudeUsageRefresher.js.map +1 -1
  185. package/dist/utils/compactOnIdle.d.ts +12 -0
  186. package/dist/utils/compactOnIdle.d.ts.map +1 -1
  187. package/dist/utils/compactOnIdle.js +15 -1
  188. package/dist/utils/compactOnIdle.js.map +1 -1
  189. package/dist/utils/doctorLine.d.ts +13 -0
  190. package/dist/utils/doctorLine.d.ts.map +1 -0
  191. package/dist/utils/doctorLine.js +18 -0
  192. package/dist/utils/doctorLine.js.map +1 -0
  193. package/dist/utils/effortPickerPlan.d.ts +1 -2
  194. package/dist/utils/effortPickerPlan.d.ts.map +1 -1
  195. package/dist/utils/effortPickerPlan.js.map +1 -1
  196. package/dist/utils/fallbackChain.d.ts +15 -8
  197. package/dist/utils/fallbackChain.d.ts.map +1 -1
  198. package/dist/utils/fallbackChain.js +30 -13
  199. package/dist/utils/fallbackChain.js.map +1 -1
  200. package/dist/utils/jsonStreamHost.d.ts +19 -7
  201. package/dist/utils/jsonStreamHost.d.ts.map +1 -1
  202. package/dist/utils/jsonStreamHost.js +25 -11
  203. package/dist/utils/jsonStreamHost.js.map +1 -1
  204. package/dist/utils/jsonStreamPendingWork.d.ts +44 -0
  205. package/dist/utils/jsonStreamPendingWork.d.ts.map +1 -0
  206. package/dist/utils/jsonStreamPendingWork.js +48 -0
  207. package/dist/utils/jsonStreamPendingWork.js.map +1 -0
  208. package/dist/utils/limitsBoardPlan.d.ts +4 -2
  209. package/dist/utils/limitsBoardPlan.d.ts.map +1 -1
  210. package/dist/utils/limitsBoardPlan.js +12 -5
  211. package/dist/utils/limitsBoardPlan.js.map +1 -1
  212. package/dist/utils/lostWork.d.ts +117 -0
  213. package/dist/utils/lostWork.d.ts.map +1 -0
  214. package/dist/utils/lostWork.js +187 -0
  215. package/dist/utils/lostWork.js.map +1 -0
  216. package/dist/utils/nativeWindows.d.ts +29 -0
  217. package/dist/utils/nativeWindows.d.ts.map +1 -0
  218. package/dist/utils/nativeWindows.js +50 -0
  219. package/dist/utils/nativeWindows.js.map +1 -0
  220. package/dist/utils/recvPreviewRedaction.d.ts +7 -2
  221. package/dist/utils/recvPreviewRedaction.d.ts.map +1 -1
  222. package/dist/utils/recvPreviewRedaction.js +10 -4
  223. package/dist/utils/recvPreviewRedaction.js.map +1 -1
  224. package/dist/utils/threadStatusReport.d.ts +12 -1
  225. package/dist/utils/threadStatusReport.d.ts.map +1 -1
  226. package/dist/utils/threadStatusReport.js +13 -4
  227. package/dist/utils/threadStatusReport.js.map +1 -1
  228. package/dist/utils/updateScreenPlan.d.ts +1 -1
  229. package/dist/utils/updateScreenPlan.d.ts.map +1 -1
  230. package/dist/utils/updateScreenPlan.js.map +1 -1
  231. package/package.json +2 -2
@@ -1,11 +1,13 @@
1
1
  import { EventEmitter } from 'events';
2
2
  import type { AgentAdapter, AgentSession, AgentRuntimeInfo, CompactionResult, DisplayPrefsReader, EffortSetOutcome, EffortState, JsonStreamTailOffset, JsonStreamTailWriter, OpenCodeQuestion, RecentTurn, ReattachRecap, ResumeSessionOptions, SeenWatermark, SeenWatermarkWriter } from '../types';
3
3
  import type { SessionKey } from '../sessionKey';
4
- import type { ClaudeConfigDirApplyResult, ClaudeConfigDirReader, ClaudeRateLimitSink } from './claudeConfigDir';
4
+ import type { ClaudeConfigDirApplyResult, ClaudeConfigDirReader, ClaudeRateLimitSink, ClaudeTurnCostSink } from './claudeConfigDir';
5
5
  import { ClaudeStreamLineReader } from '../utils/claudeStreamJson';
6
6
  import { type McpHealOutcome } from '../utils/claudeMcpHeal';
7
7
  import { type JsonStreamSessionPaths, type StdoutTailState } from '../utils/jsonStreamHost';
8
8
  import { type SessionLaunchDefaultsReader } from './sessionLaunchDefaults';
9
+ import { type LostWork } from '../utils/lostWork';
10
+ import { type ScheduledJob } from '../utils/claudeScheduledJobs';
9
11
  /** The two lifecycles of the json-stream host (see {@link ClaudeJsonStreamAdapter.lifecycle}). */
10
12
  export type JsonStreamLifecycle = 'idle' | 'perTurn';
11
13
  /** Prefix of the per-turn token accounting line (L-D11); the process-level e2e
@@ -101,6 +103,10 @@ export interface StreamSession {
101
103
  /** The `CLAUDE_CONFIG_DIR` this process runs with (its account profile, `utils/claudeProfiles.ts`); `null` =
102
104
  * the default profile. Set at spawn from the reader, recovered from the wrapper script at adopt. */
103
105
  configDir: string | null;
106
+ /** The conversation's running cost this process started from, until its first turn reports one: `0` for a new
107
+ * conversation, the transcript's last saved total for a resume (what the CLI restores); `null` from then on, for an
108
+ * adopted process (whose start the bot did not see) and when the transcript could not be read. */
109
+ startCostUsd: number | null;
104
110
  /** The topic's profile changed while the process worked: re-spawn under the reader's directory at turn end. */
105
111
  isConfigDirSwitchPending: boolean;
106
112
  currentResponseText: string;
@@ -163,11 +169,27 @@ export interface StreamSession {
163
169
  unconsumedInputCount: number;
164
170
  /**
165
171
  * The CLI's live background-task list (`system/background_tasks_changed`,
166
- * re-sent whole on every change): a background Bash / Monitor / sub-agent the
167
- * process is still running between turns. Non-empty = working (L-D2) — a stop
168
- * would kill them. Persisted with the tail offset so an adopt restores it.
172
+ * re-sent whole on every change), id → the description the agent gave it: a
173
+ * background Bash / Monitor / sub-agent the process is still running between
174
+ * turns. Non-empty = working within the hold (L-D2, `utils/jsonStreamPendingWork.ts`)
175
+ * — a stop would kill them. Persisted with the tail offset so an adopt restores it.
169
176
  */
170
- backgroundTaskIds: Set<string>;
177
+ backgroundTasks: Map<string, string>;
178
+ /**
179
+ * When a background task's `task_notification` announced the turn it starts and that
180
+ * turn has not shown yet; `null` otherwise. Counts as working for a short grace: the
181
+ * gap between the task's end and its turn's first output read as idle once.
182
+ */
183
+ notificationTurnPendingSince: number | null;
184
+ /** When the agent's last turn ended (the process start before its first turn): the pending-work hold counts from it. */
185
+ lastTurnEndedAt: number;
186
+ /**
187
+ * The next `result` ends a bot-issued `/compact` turn, not one of the agent's: the compaction settles on its
188
+ * `compact_boundary`, so `compactionInProgress` is already off when that result arrives.
189
+ */
190
+ isCompactionResultPending: boolean;
191
+ /** The session-only `CronCreate` jobs the process holds, oldest first (`utils/claudeScheduledJobs.ts`). */
192
+ scheduledJobs: Map<string, ScheduledJob>;
171
193
  /** The CLI version reported on `system/init` (`claude_code_version`); the
172
194
  * auto-stop gate (L-D10) reads it. `null` until the first init / on an adopt. */
173
195
  claudeCodeVersion: string | null;
@@ -234,8 +256,11 @@ export declare class ClaudeJsonStreamAdapter extends EventEmitter implements Age
234
256
  * conversation at a time whichever lifecycle runs it.
235
257
  */
236
258
  readonly lifecycle: JsonStreamLifecycle;
259
+ /** How long the agent's own pending work holds the process after its last turn (`utils/jsonStreamPendingWork.ts`). */
260
+ private pendingWorkHoldMs;
237
261
  constructor(options?: {
238
262
  lifecycle: JsonStreamLifecycle;
263
+ backgroundHoldMs?: number;
239
264
  });
240
265
  /** Emits incremental text deltas (like the tmux scrape) → the transports
241
266
  * synthesise continuation (`getDmDraftContinuation` / group delta path). */
@@ -251,14 +276,21 @@ export declare class ClaudeJsonStreamAdapter extends EventEmitter implements Age
251
276
  private claudeConfigDirReader;
252
277
  /** The stops in flight — the module-level map shared by both lifecycles' instances (see {@link stopsInFlightByKey}). */
253
278
  private readonly stopsInFlight;
279
+ /** The agent's own pending work each ended process took with it, until the bot takes it ({@link takeLostWork}). */
280
+ private readonly lostWorkByKey;
281
+ /** A test instance's shorter pending-work hold (`createAdapter.registerPendingWorkHoldMs`). */
282
+ setPendingWorkHoldMs(holdMs: number): void;
254
283
  setDisplayPrefsReader(reader: DisplayPrefsReader): void;
255
284
  setSeenWatermarkWriter(writer: SeenWatermarkWriter): void;
256
285
  setJsonStreamTailWriter(writer: JsonStreamTailWriter): void;
257
286
  setSessionLaunchDefaultsReader(reader: SessionLaunchDefaultsReader): void;
258
287
  setClaudeConfigDirReader(reader: ClaudeConfigDirReader): void;
259
288
  private claudeRateLimitSink;
289
+ private claudeTurnCostSink;
260
290
  /** Where a session's `rate_limit_event` frames go (the bot's per-profile usage cache). */
261
291
  setClaudeRateLimitSink(sink: ClaudeRateLimitSink): void;
292
+ /** Where every turn's `total_cost_usd` goes (an API account's spend, `utils/claudeApiSpend.ts`). */
293
+ setClaudeTurnCostSink(sink: ClaudeTurnCostSink): void;
262
294
  /** The config directory the conversation's next process must start with (its account profile). */
263
295
  private resolveConfigDir;
264
296
  private getLaunchOptions;
@@ -397,8 +429,46 @@ export declare class ClaudeJsonStreamAdapter extends EventEmitter implements Age
397
429
  * flight. An unknown / inactive session is not working.
398
430
  */
399
431
  checkIsWorking(key: SessionKey): boolean;
400
- /** Background tasks, input not yet taken in, a compaction in flight — "working" minus the turn (L-D2). */
432
+ /**
433
+ * The agent's own pending work (background tasks and scheduled jobs within the hold, a finished task's turn on its
434
+ * way), input not yet taken in, a compaction in flight — "working" minus the turn (L-D2).
435
+ */
401
436
  checkHasBackgroundWork(key: SessionKey): boolean;
437
+ /**
438
+ * @description The hold left for the session's background tasks / scheduled jobs (`utils/jsonStreamPendingWork.ts`):
439
+ * `null` without a live session or with nothing pending, `0` once spent. The idle fire re-checks no later than this.
440
+ */
441
+ getPendingWorkHoldRemainingMs(key: SessionKey): number | null;
442
+ /**
443
+ * @description Read what the process wrote since the last tail poll, so the working judgement is current: a stop
444
+ * decides on it, and the poll may lag the process by its backoff.
445
+ */
446
+ refreshWorkingState(key: SessionKey): void;
447
+ /**
448
+ * @description The agent's own pending work the conversation's LAST process took with it when it ended — a crash, a
449
+ * re-spawn, the idle stop after the pending-work hold, a process found gone at the adopt — handed over once (`null`
450
+ * when nothing was lost or it was already taken). The bot tells the agent (`utils/lostWork.ts`).
451
+ */
452
+ takeLostWork(key: SessionKey): LostWork | null;
453
+ /**
454
+ * @description What the LIVE process holds now that would die with it — read by the bot before it stops the
455
+ * process itself for a backend switch (an explicit stop records nothing); `null` when nothing is pending.
456
+ */
457
+ getPendingWork(key: SessionKey): LostWork | null;
458
+ /**
459
+ * Keep what a process that ended by itself (or at the idle stop) held. A turn a crash cut off is not counted: the
460
+ * request core re-posts and wakes an open request (R21); the idle stop never runs mid-turn.
461
+ */
462
+ private recordLostWork;
463
+ /** The pending work of a process: its background tasks, its scheduled jobs, a finished task's turn not yet run, and — when the bot itself cuts it off — the turn under way. */
464
+ private describePendingWork;
465
+ /**
466
+ * The ended process's pending work is handled here (kept for the bot, or released): the record must not carry it,
467
+ * or the next boot would read the conversation's process as one that died with work pending.
468
+ */
469
+ private clearPendingWorkOfEndedProcess;
470
+ private storeLostWork;
471
+ private getPendingWorkInput;
402
472
  /** The CLI version the live process reported on `system/init`, `null` until then (L-D10 gate input). */
403
473
  getClaudeCodeVersion(key: SessionKey): string | null;
404
474
  /** L-D10: only a CLI that reports the background-task list may be stopped automatically. */
@@ -486,6 +556,10 @@ export declare class ClaudeJsonStreamAdapter extends EventEmitter implements Age
486
556
  * WHOLE on every change, so no diffing). The tail-offset persist that follows
487
557
  * this frame's drain carries the new list to `state.json`. */
488
558
  private handleBackgroundTasks;
559
+ /** A background task ended: its own turn is coming — the list empties right after this frame, the turn shows later. */
560
+ private handleTaskNotification;
561
+ /** A turn began (its `init`, the CLI's running state, a scheduled job firing): busy from here; an announced turn has shown. */
562
+ private markTurnStarted;
489
563
  private handleCompactStatus;
490
564
  private handleCompactBoundary;
491
565
  /**
@@ -500,6 +574,8 @@ export declare class ClaudeJsonStreamAdapter extends EventEmitter implements Age
500
574
  private finishReasoning;
501
575
  private handleToolUse;
502
576
  private handleToolResult;
577
+ /** A `CronCreate` / `CronDelete` / `ScheduleWakeup` result changes the session-only jobs the process holds. */
578
+ private trackScheduledJob;
503
579
  private markSubagentActive;
504
580
  private handleSubagentText;
505
581
  private clearSubagent;
@@ -1 +1 @@
1
- {"version":3,"file":"claudeJsonStreamAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/claudeJsonStreamAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claudeJsonStreamAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/claudeJsonStreamAdapter.ts"],"names":[],"mappings":"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"}
@@ -63,6 +63,9 @@ const claudeProfiles_1 = require("../utils/claudeProfiles");
63
63
  const adapterNames_1 = require("./adapterNames");
64
64
  const claudeCodeVersion_1 = require("../utils/claudeCodeVersion");
65
65
  const sessionLaunchDefaults_1 = require("./sessionLaunchDefaults");
66
+ const jsonStreamPendingWork_1 = require("../utils/jsonStreamPendingWork");
67
+ const lostWork_1 = require("../utils/lostWork");
68
+ const claudeScheduledJobs_1 = require("../utils/claudeScheduledJobs");
66
69
  /**
67
70
  * In-flight explicit stops, per key — a second stop (or a start's implicit stop)
68
71
  * AWAITS the first instead of racing it: the delayed first `tmux kill-session`
@@ -126,9 +129,12 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
126
129
  * conversation at a time whichever lifecycle runs it.
127
130
  */
128
131
  lifecycle;
132
+ /** How long the agent's own pending work holds the process after its last turn (`utils/jsonStreamPendingWork.ts`). */
133
+ pendingWorkHoldMs;
129
134
  constructor(options = { lifecycle: 'idle' }) {
130
135
  super();
131
136
  this.lifecycle = options.lifecycle;
137
+ this.pendingWorkHoldMs = options.backgroundHoldMs ?? jsonStreamPendingWork_1.pendingWorkHoldDefaultMs;
132
138
  this.name = options.lifecycle === 'perTurn' ? adapterNames_1.claudePerTurnAdapterName : adapterNames_1.claudeJsonStreamAdapterName;
133
139
  this.label = options.lifecycle === 'perTurn' ? 'Claude Code (per-turn)' : 'Claude Code (stream)';
134
140
  }
@@ -146,6 +152,12 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
146
152
  claudeConfigDirReader = null;
147
153
  /** The stops in flight — the module-level map shared by both lifecycles' instances (see {@link stopsInFlightByKey}). */
148
154
  stopsInFlight = stopsInFlightByKey;
155
+ /** The agent's own pending work each ended process took with it, until the bot takes it ({@link takeLostWork}). */
156
+ lostWorkByKey = new Map();
157
+ /** A test instance's shorter pending-work hold (`createAdapter.registerPendingWorkHoldMs`). */
158
+ setPendingWorkHoldMs(holdMs) {
159
+ this.pendingWorkHoldMs = holdMs;
160
+ }
149
161
  setDisplayPrefsReader(reader) {
150
162
  this.displayPrefsReader = reader;
151
163
  }
@@ -162,10 +174,15 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
162
174
  this.claudeConfigDirReader = reader;
163
175
  }
164
176
  claudeRateLimitSink = null;
177
+ claudeTurnCostSink = null;
165
178
  /** Where a session's `rate_limit_event` frames go (the bot's per-profile usage cache). */
166
179
  setClaudeRateLimitSink(sink) {
167
180
  this.claudeRateLimitSink = sink;
168
181
  }
182
+ /** Where every turn's `total_cost_usd` goes (an API account's spend, `utils/claudeApiSpend.ts`). */
183
+ setClaudeTurnCostSink(sink) {
184
+ this.claudeTurnCostSink = sink;
185
+ }
169
186
  /** The config directory the conversation's next process must start with (its account profile). */
170
187
  resolveConfigDir(key) {
171
188
  return this.claudeConfigDirReader?.(key) ?? null;
@@ -229,7 +246,10 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
229
246
  // transcript the CLI's own cleanup removed leaves only a metadata stub when its process is stopped — proof it had
230
247
  // turns: `--resume` answers "No conversation found" and `--session-id` "already in use" on it (the stub is removed
231
248
  // first). Removed while it SLEPT, it leaves no file at all: only the caller knows it had turns (`isConversationRecorded`).
232
- const { isResumable, isConversationLost } = await (0, claudeTranscriptContent_1.prepareClaudeSessionLaunch)((0, claudeCliAdapter_1.getClaudeTranscriptPath)(workDir, sessionId), opts.conversation !== 'new', opts.isConversationRecorded === true);
249
+ const transcriptPath = (0, claudeCliAdapter_1.getClaudeTranscriptPath)(workDir, sessionId);
250
+ const { isResumable, isConversationLost } = await (0, claudeTranscriptContent_1.prepareClaudeSessionLaunch)(transcriptPath, opts.conversation !== 'new', opts.isConversationRecorded === true);
251
+ // What the new process restores, read while none of the conversation runs (an API account's spend counts from it).
252
+ const startCostUsd = isResumable ? await (0, claudeTranscriptContent_1.readClaudeTranscriptRestoredCostUsd)(transcriptPath, sessionId) : 0;
233
253
  if (opts.conversation === 'resume' && isConversationLost) {
234
254
  throw new Error(`No conversation to resume for session ${sessionId}: its transcript holds none`);
235
255
  }
@@ -265,13 +285,16 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
265
285
  if (opts.effort)
266
286
  args.push(jsonStreamHost_1.claudeEffortFlag, opts.effort);
267
287
  args.push(...mcpFlags);
268
- // Overflow-triggered compaction gets the bot's summary guidance (see the module).
269
- args.push(...(0, claudeCompactHook_1.prepareClaudeCompactHookFlags)((0, state_1.resolveDataDir)()));
288
+ // Overflow-triggered compaction gets the bot's summary guidance (see the module); a profile that holds a
289
+ // pasted API key gets it in its own settings file, beside the `apiKeyHelper` that reads the key.
290
+ args.push(...(0, claudeCompactHook_1.prepareClaudeCompactHookFlags)((0, state_1.resolveDataDir)(), opts.configDir));
270
291
  // Subscription billing: the wrapper runs `env -u ANTHROPIC_API_KEY` (a set
271
292
  // key would meter the API); a tracker conversation's wrapper starts claude
272
293
  // with `env -i` and the agent allowlist instead (R32) — no key either. The CLI
273
294
  // reads the OAuth login from ~/.claude — `apiKeySource:"none"` (probe-verified
274
- // under the wrapper).
295
+ // under the wrapper). An API account (`utils/claudeProfiles.ts`) is metered on
296
+ // purpose, yet never through that variable: its key is the console login's in
297
+ // its own directory, or a pasted key the `apiKeyHelper` of its settings reads.
275
298
  const sessionDir = (0, jsonStreamHost_1.resolveJsonStreamSessionDir)((0, state_1.resolveDataDir)(), key);
276
299
  const paths = (0, jsonStreamHost_1.getJsonStreamSessionPaths)(sessionDir);
277
300
  const tmuxName = (0, jsonStreamHost_1.buildJsonStreamTmuxSessionName)(key);
@@ -317,7 +340,7 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
317
340
  isActive: true, isStopping: false, isSuspending: false, isRespawning: false, isBusy: false, unconsumedInputCount: 0,
318
341
  lastStdoutActivityAt: Date.now(), outstandingToolUseIds: new Set(),
319
342
  model: opts.model, reportedModel: null, effort: opts.effort,
320
- configDir: opts.configDir, isConfigDirSwitchPending: false,
343
+ configDir: opts.configDir, isConfigDirSwitchPending: false, startCostUsd,
321
344
  currentResponseText: '', emittedLength: 0, outputTimer: null,
322
345
  reasoningText: '', reasoningStartedAt: null, reasoningTimer: null, reasoningActive: false,
323
346
  toolNamesById: new Map(), questionToolUseIds: new Set(),
@@ -326,7 +349,8 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
326
349
  compactionInProgress: false, pendingCompaction: null,
327
350
  pendingQuestion: null, apiErrorFired: false, rejectedResetAtMs: null, swallowNextAbortError: false,
328
351
  lastWatermarkOffset: -1,
329
- backgroundTaskIds: new Set(), claudeCodeVersion: null, applyingChunk: null,
352
+ backgroundTasks: new Map(), notificationTurnPendingSince: null, lastTurnEndedAt: Date.now(), isCompactionResultPending: false, scheduledJobs: new Map(),
353
+ claudeCodeVersion: null, applyingChunk: null,
330
354
  adoptCatchUpOffset: null, adoptCatchUpResolvers: [],
331
355
  };
332
356
  this.sessions.set((0, sessionKey_1.keyToString)(key), session);
@@ -507,6 +531,12 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
507
531
  // Only act if this session is still the current one for the key.
508
532
  if (this.sessions.get((0, sessionKey_1.keyToString)(key)) !== session)
509
533
  return;
534
+ // An explicit stop (`/quit`, `/new`, a backend switch) releases the conversation and its record: nothing to tell
535
+ // its agent, nothing to write back — a write after the release would bring back a record the bot dropped.
536
+ if (!session.isStopping || session.isSuspending) {
537
+ this.recordLostWork(session);
538
+ this.clearPendingWorkOfEndedProcess(session);
539
+ }
510
540
  this.clearTimers(session);
511
541
  session.isActive = false;
512
542
  this.sessions.delete((0, sessionKey_1.keyToString)(key));
@@ -615,6 +645,7 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
615
645
  const exitCode = (0, jsonStreamHost_1.readExitCodeFile)(paths.exitCodeFile);
616
646
  if (pid === null || exitCode !== null || !(0, jsonStreamHost_1.checkIsPidAlive)(pid)) {
617
647
  console.log(`[ClaudeJson] adopt: ${sessionName} process is dead (pid=${pid} exit=${exitCode}), cleaning up`);
648
+ this.storeLostWork(key, (0, lostWork_1.getLostWorkFromTailRecord)(persistedTail, claudeSessionId));
618
649
  await this.killOrphanTmuxSession(sessionName);
619
650
  return false;
620
651
  }
@@ -625,7 +656,8 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
625
656
  return false;
626
657
  }
627
658
  const size = (0, jsonStreamHost_1.getFileSize)(paths.stdoutFile) ?? 0;
628
- const { startOffset, backgroundTaskIds, isTurnInFlight, outstandingToolUseIds, claudeCodeVersion } = (0, jsonStreamHost_1.resolveAdoptedTail)(persistedTail, claudeSessionId, size);
659
+ const adoptedTail = (0, jsonStreamHost_1.resolveAdoptedTail)(persistedTail, claudeSessionId, size);
660
+ const { startOffset, isTurnInFlight, outstandingToolUseIds, claudeCodeVersion } = adoptedTail;
629
661
  console.log(`[ClaudeJson] adopt: re-attaching to ${sessionName} in ${workDir} (pid=${pid}, tail=${startOffset}/${size})`);
630
662
  const launchFlags = (0, jsonStreamHost_1.readWrapperScriptLaunchFlags)(paths.wrapperFile);
631
663
  const session = {
@@ -648,7 +680,8 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
648
680
  // the topic resolves to now, and a later re-spawn passes them on.
649
681
  model: launchFlags.model, reportedModel: null, effort: launchFlags.effort,
650
682
  // The account the surviving process runs on is in its own wrapper; the bot compares it with the topic's pick.
651
- configDir: (0, jsonStreamHost_1.readWrapperScriptConfigDir)(paths.wrapperFile), isConfigDirSwitchPending: false,
683
+ // A switch the user picked while the process worked survives the reload: it still applies at the turn's end.
684
+ configDir: (0, jsonStreamHost_1.readWrapperScriptConfigDir)(paths.wrapperFile), isConfigDirSwitchPending: adoptedTail.isConfigDirSwitchPending, startCostUsd: null,
652
685
  currentResponseText: '', emittedLength: 0, outputTimer: null,
653
686
  reasoningText: '', reasoningStartedAt: null, reasoningTimer: null, reasoningActive: false,
654
687
  toolNamesById: new Map(), questionToolUseIds: new Set(),
@@ -659,8 +692,14 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
659
692
  apiErrorFired: false, rejectedResetAtMs: null, swallowNextAbortError: false,
660
693
  lastWatermarkOffset: -1,
661
694
  // The frames that built the list and reported the version lie before the
662
- // tail offset (not replayed): both come from the persisted record.
663
- backgroundTaskIds: new Set(backgroundTaskIds), claudeCodeVersion, applyingChunk: null,
695
+ // tail offset (not replayed): both come from the persisted record, with the
696
+ // rest of the pending work (a turn announced, the hold's start, scheduled jobs).
697
+ backgroundTasks: new Map(adoptedTail.backgroundTasks.map((task) => [task.taskId, task.description])),
698
+ notificationTurnPendingSince: adoptedTail.notificationTurnPendingSinceMs,
699
+ lastTurnEndedAt: adoptedTail.lastTurnEndedAtMs ?? Date.now(),
700
+ isCompactionResultPending: false,
701
+ scheduledJobs: new Map(adoptedTail.scheduledJobs.map((job) => [job.jobId, job])),
702
+ claudeCodeVersion, applyingChunk: null,
664
703
  // Nothing to catch up on when the tail already sits at EOF.
665
704
  adoptCatchUpOffset: startOffset < size ? size : null, adoptCatchUpResolvers: [],
666
705
  };
@@ -699,6 +738,9 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
699
738
  const resolvers = session.adoptCatchUpResolvers.splice(0);
700
739
  for (const resolve of resolvers)
701
740
  resolve();
741
+ // A switch the user picked before the reload, whose turn ended meanwhile, applies now that the state is current.
742
+ if (!isSessionGone)
743
+ this.applyPendingConfigDirSwitch(session);
702
744
  }
703
745
  /** Restore a pending question persisted by a previous bot life (see
704
746
  * {@link writeQuestionSidecar}). Parse-boundary narrowing; the questions
@@ -830,15 +872,105 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
830
872
  return false;
831
873
  return session.isBusy || this.checkHasBackgroundWork(key);
832
874
  }
833
- /** Background tasks, input not yet taken in, a compaction in flight — "working" minus the turn (L-D2). */
875
+ /**
876
+ * The agent's own pending work (background tasks and scheduled jobs within the hold, a finished task's turn on its
877
+ * way), input not yet taken in, a compaction in flight — "working" minus the turn (L-D2).
878
+ */
834
879
  checkHasBackgroundWork(key) {
835
880
  const session = this.sessions.get((0, sessionKey_1.keyToString)(key));
836
881
  if (!session?.isActive)
837
882
  return false;
838
- return session.backgroundTaskIds.size > 0
883
+ return (0, jsonStreamPendingWork_1.checkHasPendingWork)(this.getPendingWorkInput(session))
839
884
  || session.unconsumedInputCount > 0
840
885
  || session.compactionInProgress;
841
886
  }
887
+ /**
888
+ * @description The hold left for the session's background tasks / scheduled jobs (`utils/jsonStreamPendingWork.ts`):
889
+ * `null` without a live session or with nothing pending, `0` once spent. The idle fire re-checks no later than this.
890
+ */
891
+ getPendingWorkHoldRemainingMs(key) {
892
+ const session = this.sessions.get((0, sessionKey_1.keyToString)(key));
893
+ return session?.isActive ? (0, jsonStreamPendingWork_1.getPendingWorkHoldRemainingMs)(this.getPendingWorkInput(session)) : null;
894
+ }
895
+ /**
896
+ * @description Read what the process wrote since the last tail poll, so the working judgement is current: a stop
897
+ * decides on it, and the poll may lag the process by its backoff.
898
+ */
899
+ refreshWorkingState(key) {
900
+ const session = this.sessions.get((0, sessionKey_1.keyToString)(key));
901
+ if (!session?.isActive)
902
+ return;
903
+ try {
904
+ this.drainStdoutTail(session);
905
+ }
906
+ catch (e) {
907
+ console.warn(`[ClaudeJson] stdout tail read failed for ${(0, sessionKey_1.keyToString)(key)}:`, e instanceof Error ? e.message : e);
908
+ }
909
+ }
910
+ /**
911
+ * @description The agent's own pending work the conversation's LAST process took with it when it ended — a crash, a
912
+ * re-spawn, the idle stop after the pending-work hold, a process found gone at the adopt — handed over once (`null`
913
+ * when nothing was lost or it was already taken). The bot tells the agent (`utils/lostWork.ts`).
914
+ */
915
+ takeLostWork(key) {
916
+ const k = (0, sessionKey_1.keyToString)(key);
917
+ const lostWork = this.lostWorkByKey.get(k) ?? null;
918
+ this.lostWorkByKey.delete(k);
919
+ return lostWork;
920
+ }
921
+ /**
922
+ * @description What the LIVE process holds now that would die with it — read by the bot before it stops the
923
+ * process itself for a backend switch (an explicit stop records nothing); `null` when nothing is pending.
924
+ */
925
+ getPendingWork(key) {
926
+ const session = this.sessions.get((0, sessionKey_1.keyToString)(key));
927
+ if (!session?.isActive)
928
+ return null;
929
+ const pendingWork = this.describePendingWork(session, { isTurnCutOff: true });
930
+ return (0, lostWork_1.checkHasLostWork)(pendingWork) ? pendingWork : null;
931
+ }
932
+ /**
933
+ * Keep what a process that ended by itself (or at the idle stop) held. A turn a crash cut off is not counted: the
934
+ * request core re-posts and wakes an open request (R21); the idle stop never runs mid-turn.
935
+ */
936
+ recordLostWork(session) {
937
+ this.storeLostWork(session.key, this.describePendingWork(session, { isTurnCutOff: false }));
938
+ }
939
+ /** The pending work of a process: its background tasks, its scheduled jobs, a finished task's turn not yet run, and — when the bot itself cuts it off — the turn under way. */
940
+ describePendingWork(session, options) {
941
+ return {
942
+ backgroundTasks: [...session.backgroundTasks].map(([taskId, description]) => ({ taskId, description })),
943
+ scheduledJobCount: session.scheduledJobs.size,
944
+ hasUnreadTaskResult: (0, jsonStreamPendingWork_1.checkIsNotificationTurnPending)({ now: Date.now(), notificationTurnPendingSince: session.notificationTurnPendingSince }),
945
+ wasTurnInFlight: options.isTurnCutOff && session.isBusy && !session.compactionInProgress,
946
+ };
947
+ }
948
+ /**
949
+ * The ended process's pending work is handled here (kept for the bot, or released): the record must not carry it,
950
+ * or the next boot would read the conversation's process as one that died with work pending.
951
+ */
952
+ clearPendingWorkOfEndedProcess(session) {
953
+ session.backgroundTasks = new Map();
954
+ session.scheduledJobs = new Map();
955
+ session.notificationTurnPendingSince = null;
956
+ this.jsonStreamTailWriter?.(session.key, buildTailRecord(session, session.lastPersistedTailOffset));
957
+ }
958
+ storeLostWork(key, lostWork) {
959
+ if ((0, lostWork_1.checkHasLostWork)(lostWork))
960
+ this.lostWorkByKey.set((0, sessionKey_1.keyToString)(key), lostWork);
961
+ else
962
+ this.lostWorkByKey.delete((0, sessionKey_1.keyToString)(key));
963
+ }
964
+ getPendingWorkInput(session) {
965
+ return {
966
+ now: Date.now(),
967
+ backgroundTaskCount: session.backgroundTasks.size,
968
+ scheduledJobCount: session.scheduledJobs.size,
969
+ lastTurnEndedAt: session.lastTurnEndedAt,
970
+ holdMs: this.pendingWorkHoldMs,
971
+ notificationTurnPendingSince: session.notificationTurnPendingSince,
972
+ };
973
+ }
842
974
  /** The CLI version the live process reported on `system/init`, `null` until then (L-D10 gate input). */
843
975
  getClaudeCodeVersion(key) {
844
976
  return this.sessions.get((0, sessionKey_1.keyToString)(key))?.claudeCodeVersion ?? null;
@@ -923,6 +1055,7 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
923
1055
  timer.unref?.();
924
1056
  session.pendingCompaction = { resolve, timer, sawSuccess: false };
925
1057
  session.compactionInProgress = true;
1058
+ session.isCompactionResultPending = true;
926
1059
  // Fresh turn: reset the answer cursor + idle-watchdog clock, mark busy.
927
1060
  session.currentResponseText = '';
928
1061
  session.emittedLength = 0;
@@ -1175,6 +1308,9 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
1175
1308
  case 'backgroundTasks':
1176
1309
  this.handleBackgroundTasks(session, action);
1177
1310
  return;
1311
+ case 'taskNotification':
1312
+ this.handleTaskNotification(session, action);
1313
+ return;
1178
1314
  case 'apiRetry':
1179
1315
  this.maybeEmitApiError(session, action.text);
1180
1316
  return;
@@ -1194,10 +1330,20 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
1194
1330
  // it `/status` and the pinned banner showed no model at all on a default
1195
1331
  // start / resume / adopt (nothing ever set the `--model` pick).
1196
1332
  this.handleInit(session, action);
1333
+ // `init` opens every turn: the turn runs from here, not from its first output.
1334
+ this.markTurnStarted(session);
1335
+ return;
1336
+ case 'turnStarted':
1337
+ this.markTurnStarted(session);
1338
+ if (action.wakeupSource !== null)
1339
+ session.scheduledJobs = (0, claudeScheduledJobs_1.getScheduledJobsAfterFiring)(session.scheduledJobs, action.wakeupSource);
1197
1340
  return;
1198
1341
  case 'backgroundTasks':
1199
1342
  this.handleBackgroundTasks(session, action);
1200
1343
  return;
1344
+ case 'taskNotification':
1345
+ this.handleTaskNotification(session, action);
1346
+ return;
1201
1347
  case 'textDelta':
1202
1348
  // Mid-turn activity marks the session busy: `sendInput` normally set it,
1203
1349
  // but an ADOPTED session (bot restart mid-turn) reconstructs the busy
@@ -1263,7 +1409,17 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
1263
1409
  * WHOLE on every change, so no diffing). The tail-offset persist that follows
1264
1410
  * this frame's drain carries the new list to `state.json`. */
1265
1411
  handleBackgroundTasks(session, action) {
1266
- session.backgroundTaskIds = new Set(action.taskIds);
1412
+ session.backgroundTasks = new Map(action.tasks.map((task) => [task.taskId, task.description]));
1413
+ }
1414
+ /** A background task ended: its own turn is coming — the list empties right after this frame, the turn shows later. */
1415
+ handleTaskNotification(session, action) {
1416
+ if (session.backgroundTasks.has(action.taskId))
1417
+ session.notificationTurnPendingSince = Date.now();
1418
+ }
1419
+ /** A turn began (its `init`, the CLI's running state, a scheduled job firing): busy from here; an announced turn has shown. */
1420
+ markTurnStarted(session) {
1421
+ session.isBusy = true;
1422
+ session.notificationTurnPendingSince = null;
1267
1423
  }
1268
1424
  // — compaction (F3) —
1269
1425
  handleCompactStatus(session, action) {
@@ -1390,11 +1546,25 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
1390
1546
  if (session.questionToolUseIds.has(action.toolUseId))
1391
1547
  return;
1392
1548
  const tool = session.toolNamesById.get(action.toolUseId) ?? 'tool';
1549
+ this.trackScheduledJob(session, tool, action.output);
1393
1550
  if (!action.output.trim())
1394
1551
  return;
1395
1552
  // Mode-agnostic emit — the bot applies the per-thread `/tool_results` pref.
1396
1553
  this.emit('toolResult', session.key, { tool, output: action.output });
1397
1554
  }
1555
+ /** A `CronCreate` / `CronDelete` / `ScheduleWakeup` result changes the session-only jobs the process holds. */
1556
+ trackScheduledJob(session, tool, output) {
1557
+ if (tool === claudeScheduledJobs_1.cronCreateToolName || tool === claudeScheduledJobs_1.loopWakeupToolName) {
1558
+ const job = tool === claudeScheduledJobs_1.cronCreateToolName ? (0, claudeScheduledJobs_1.getScheduledJobFromCronCreateResult)(output) : (0, claudeScheduledJobs_1.getScheduledJobFromLoopWakeupResult)(output);
1559
+ if (job)
1560
+ session.scheduledJobs.set(job.jobId, job);
1561
+ }
1562
+ else if (tool === claudeScheduledJobs_1.cronDeleteToolName) {
1563
+ const jobId = (0, claudeScheduledJobs_1.getCancelledJobIdFromCronDeleteResult)(output);
1564
+ if (jobId)
1565
+ session.scheduledJobs.delete(jobId);
1566
+ }
1567
+ }
1398
1568
  // — sub-agent (v1) —
1399
1569
  markSubagentActive(session) {
1400
1570
  session.subagentActive = true;
@@ -1437,6 +1607,13 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
1437
1607
  // — turn end —
1438
1608
  /** Every terminal `result` — a normal turn, a compaction turn, an error — ends with the `turnEnded` event. */
1439
1609
  handleTurnEnd(session, action) {
1610
+ // Every turn's cost, the compaction turn's too: what an account billed to API credits spends (the bot keeps the baseline).
1611
+ if (action.totalCostUsd !== null) {
1612
+ this.claudeTurnCostSink?.(session.key, session.configDir, {
1613
+ sessionId: session.sessionId, totalCostUsd: action.totalCostUsd, startCostUsd: session.startCostUsd, isError: action.isError,
1614
+ });
1615
+ session.startCostUsd = null;
1616
+ }
1440
1617
  this.applyTurnEnd(session, action);
1441
1618
  // After the handlers above: the bot's per-turn stop (L5) reads the session's state as settled here.
1442
1619
  this.emit('turnEnded', session.key);
@@ -1451,6 +1628,13 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
1451
1628
  console.log(`${exports.claudeJsonStreamUsageLogPrefix}${(0, sessionKey_1.keyToString)(session.key)}: input=${inputTokens} cacheRead=${cacheReadTokens} cacheWrite=${cacheWriteTokens} output=${outputTokens}`);
1452
1629
  }
1453
1630
  session.isBusy = false;
1631
+ // The pending-work hold counts from the agent's own last turn: a bot-issued compaction is not one. A task that
1632
+ // finished during the turn is NOT folded into it: its own turn starts right after this `result` (`init` +45 ms,
1633
+ // measured on 2.1.310), so its announcement stays until that turn shows — clearing it here would let the per-turn
1634
+ // stop kill the process in that gap.
1635
+ if (!session.isCompactionResultPending)
1636
+ session.lastTurnEndedAt = Date.now();
1637
+ session.isCompactionResultPending = false;
1454
1638
  // Self-healing accounting: a FAILED turn (usage limit, API error) may never echo the messages that were
1455
1639
  // queued behind it, and a count left above zero would make the session look "working" forever — a pending
1456
1640
  // account switch would never fire. A message still genuinely queued is echoed later (the decrement clamps
@@ -1785,6 +1969,9 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
1785
1969
  const { key, workDir, sessionId } = session;
1786
1970
  const configDir = change.configDir === undefined ? session.configDir : change.configDir;
1787
1971
  session.isRespawning = true;
1972
+ // The re-spawned process starts with none of the old one's background tasks or jobs, and the turn it cuts off is
1973
+ // re-prompted by nothing else.
1974
+ this.storeLostWork(key, this.describePendingWork(session, { isTurnCutOff: true }));
1788
1975
  this.rejectQuestion(key);
1789
1976
  await session.stdinWriteChain.catch(() => { });
1790
1977
  this.clearTimers(session);
@@ -1825,6 +2012,8 @@ class ClaudeJsonStreamAdapter extends events_1.EventEmitter {
1825
2012
  }
1826
2013
  if (!options.isAfterLimit && this.checkIsWorking(key)) {
1827
2014
  session.isConfigDirSwitchPending = true;
2015
+ // Recorded now: a reload before the turn ends must not drop the user's pick.
2016
+ this.jsonStreamTailWriter?.(key, buildTailRecord(session, session.lastPersistedTailOffset));
1828
2017
  return 'deferred';
1829
2018
  }
1830
2019
  session.isConfigDirSwitchPending = false;
@@ -1882,14 +2071,22 @@ exports.ClaudeJsonStreamAdapter = ClaudeJsonStreamAdapter;
1882
2071
  * state in force there (task list, turn in flight, outstanding tools) travel together
1883
2072
  * (see `JsonStreamTailOffset`). */
1884
2073
  function buildTailRecord(session, offsetBytes) {
2074
+ const backgroundTasks = [...session.backgroundTasks].map(([taskId, description]) => ({ taskId, description }));
2075
+ const isWorkPending = session.backgroundTasks.size > 0 || session.scheduledJobs.size > 0;
1885
2076
  return {
1886
2077
  sessionId: session.sessionId,
1887
2078
  offsetBytes,
1888
- backgroundTaskIds: [...session.backgroundTaskIds],
2079
+ backgroundTaskIds: backgroundTasks.map((task) => task.taskId),
1889
2080
  isTurnInFlight: session.isBusy,
1890
2081
  outstandingToolUseIds: [...session.outstandingToolUseIds],
1891
2082
  // Only once known: the record never claims a version the process did not report.
1892
2083
  ...(session.claudeCodeVersion !== null ? { claudeCodeVersion: session.claudeCodeVersion } : {}),
2084
+ // The pending work only while there is some: an idle record stays as it was.
2085
+ ...(backgroundTasks.length > 0 ? { backgroundTasks } : {}),
2086
+ ...(isWorkPending ? { lastTurnEndedAtMs: session.lastTurnEndedAt } : {}),
2087
+ ...(session.scheduledJobs.size > 0 ? { scheduledJobs: [...session.scheduledJobs.values()] } : {}),
2088
+ ...(session.notificationTurnPendingSince !== null ? { notificationTurnPendingSinceMs: session.notificationTurnPendingSince } : {}),
2089
+ ...(session.isConfigDirSwitchPending ? { isConfigDirSwitchPending: true } : {}),
1893
2090
  };
1894
2091
  }
1895
2092
  /**