crewly 1.20.355 → 1.20.356

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 (177) hide show
  1. package/config/roles/team-leader/prompt.md +1 -1
  2. package/config/roles/team-leader/tl-addon.md +1 -1
  3. package/config/skills/team-leader/delegate-task/SKILL.md +23 -1
  4. package/config/skills/team-leader/delegate-task/execute.sh +44 -1
  5. package/config/skills/team-leader/delegate-task/execute.test.sh +95 -1
  6. package/dist/backend/backend/src/constants.d.ts +65 -0
  7. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  8. package/dist/backend/backend/src/constants.js +65 -0
  9. package/dist/backend/backend/src/constants.js.map +1 -1
  10. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts.map +1 -1
  11. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js +10 -0
  12. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js.map +1 -1
  13. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts.map +1 -1
  14. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js +7 -0
  15. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -1
  16. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  17. package/dist/backend/backend/src/controllers/team/team.controller.js +5 -0
  18. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  19. package/dist/backend/backend/src/index.d.ts +15 -0
  20. package/dist/backend/backend/src/index.d.ts.map +1 -1
  21. package/dist/backend/backend/src/index.js +68 -11
  22. package/dist/backend/backend/src/index.js.map +1 -1
  23. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +11 -0
  24. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  25. package/dist/backend/backend/src/services/agent/agent-registration.service.js +73 -1
  26. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  27. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +9 -1
  28. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  29. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +60 -4
  30. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  31. package/dist/backend/backend/src/services/agent/resource-mode-protection.d.ts +22 -0
  32. package/dist/backend/backend/src/services/agent/resource-mode-protection.d.ts.map +1 -1
  33. package/dist/backend/backend/src/services/agent/resource-mode-protection.js +33 -0
  34. package/dist/backend/backend/src/services/agent/resource-mode-protection.js.map +1 -1
  35. package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts +50 -3
  36. package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
  37. package/dist/backend/backend/src/services/agent/resource-mode.service.js +92 -10
  38. package/dist/backend/backend/src/services/agent/resource-mode.service.js.map +1 -1
  39. package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts +23 -0
  40. package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
  41. package/dist/backend/backend/src/services/harness/harness-relogin.service.js +47 -6
  42. package/dist/backend/backend/src/services/harness/harness-relogin.service.js.map +1 -1
  43. package/dist/backend/backend/src/services/messaging/deferred-start-retry.d.ts +14 -2
  44. package/dist/backend/backend/src/services/messaging/deferred-start-retry.d.ts.map +1 -1
  45. package/dist/backend/backend/src/services/messaging/deferred-start-retry.js +21 -4
  46. package/dist/backend/backend/src/services/messaging/deferred-start-retry.js.map +1 -1
  47. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  48. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +10 -1
  49. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  50. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +8 -0
  51. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  52. package/dist/backend/backend/src/services/open-items/open-items.service.js +33 -0
  53. package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
  54. package/dist/backend/backend/src/services/open-items/open-items.wiring.js +2 -2
  55. package/dist/backend/backend/src/services/open-items/open-items.wiring.js.map +1 -1
  56. package/dist/backend/backend/src/services/open-items/question-card-gate.d.ts +49 -0
  57. package/dist/backend/backend/src/services/open-items/question-card-gate.d.ts.map +1 -0
  58. package/dist/backend/backend/src/services/open-items/question-card-gate.js +77 -0
  59. package/dist/backend/backend/src/services/open-items/question-card-gate.js.map +1 -0
  60. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts.map +1 -1
  61. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js +10 -0
  62. package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -1
  63. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts +2 -0
  64. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
  65. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js +17 -0
  66. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
  67. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts +7 -0
  68. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js +22 -10
  70. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
  71. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts +16 -0
  72. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js +23 -0
  74. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
  75. package/dist/backend/backend/src/services/runtime-fallback/reset-time.d.ts +2 -1
  76. package/dist/backend/backend/src/services/runtime-fallback/reset-time.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/runtime-fallback/reset-time.js +3 -2
  78. package/dist/backend/backend/src/services/runtime-fallback/reset-time.js.map +1 -1
  79. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts +101 -5
  80. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
  81. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +247 -19
  82. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
  83. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -1
  84. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +10 -2
  85. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
  86. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.d.ts +78 -0
  87. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.d.ts.map +1 -1
  88. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.js +159 -1
  89. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-rules.js.map +1 -1
  90. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-screen.d.ts +63 -0
  91. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-screen.d.ts.map +1 -0
  92. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-screen.js +104 -0
  93. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-screen.js.map +1 -0
  94. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-state.d.ts +166 -0
  95. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-state.d.ts.map +1 -0
  96. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-state.js +207 -0
  97. package/dist/backend/backend/src/services/runtime-fallback/usage-limit-state.js.map +1 -0
  98. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  99. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +13 -0
  100. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  101. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +22 -0
  102. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  103. package/dist/backend/backend/src/services/workflow/scheduler.service.js +35 -1
  104. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  105. package/dist/backend/backend/src/types/index.d.ts +12 -0
  106. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  107. package/dist/backend/backend/src/types/index.js.map +1 -1
  108. package/dist/backend/backend/src/types/team-template.types.d.ts +1 -0
  109. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
  110. package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
  111. package/dist/backend/build-info.json +2 -2
  112. package/dist/cli/backend/src/constants.d.ts +65 -0
  113. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  114. package/dist/cli/backend/src/constants.js +65 -0
  115. package/dist/cli/backend/src/constants.js.map +1 -1
  116. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +11 -0
  117. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  118. package/dist/cli/backend/src/services/agent/agent-registration.service.js +73 -1
  119. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  120. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +9 -1
  121. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  122. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +60 -4
  123. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  124. package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts +50 -3
  125. package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
  126. package/dist/cli/backend/src/services/agent/resource-mode.service.js +92 -10
  127. package/dist/cli/backend/src/services/agent/resource-mode.service.js.map +1 -1
  128. package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts +23 -0
  129. package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
  130. package/dist/cli/backend/src/services/harness/harness-relogin.service.js +47 -6
  131. package/dist/cli/backend/src/services/harness/harness-relogin.service.js.map +1 -1
  132. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  133. package/dist/cli/backend/src/services/messaging/queue-processor.service.js +10 -1
  134. package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  135. package/dist/cli/backend/src/services/open-items/open-items.service.d.ts +8 -0
  136. package/dist/cli/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  137. package/dist/cli/backend/src/services/open-items/open-items.service.js +33 -0
  138. package/dist/cli/backend/src/services/open-items/open-items.service.js.map +1 -1
  139. package/dist/cli/backend/src/services/open-items/question-card-gate.d.ts +49 -0
  140. package/dist/cli/backend/src/services/open-items/question-card-gate.d.ts.map +1 -0
  141. package/dist/cli/backend/src/services/open-items/question-card-gate.js +77 -0
  142. package/dist/cli/backend/src/services/open-items/question-card-gate.js.map +1 -0
  143. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts +2 -0
  144. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
  145. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js +17 -0
  146. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
  147. package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.d.ts +7 -0
  148. package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -1
  149. package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.js +22 -10
  150. package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
  151. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts +16 -0
  152. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
  153. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js +23 -0
  154. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
  155. package/dist/cli/backend/src/services/runtime-fallback/reset-time.d.ts +2 -1
  156. package/dist/cli/backend/src/services/runtime-fallback/reset-time.d.ts.map +1 -1
  157. package/dist/cli/backend/src/services/runtime-fallback/reset-time.js +3 -2
  158. package/dist/cli/backend/src/services/runtime-fallback/reset-time.js.map +1 -1
  159. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-rules.d.ts +78 -0
  160. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-rules.d.ts.map +1 -1
  161. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-rules.js +159 -1
  162. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-rules.js.map +1 -1
  163. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-screen.d.ts +63 -0
  164. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-screen.d.ts.map +1 -0
  165. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-screen.js +104 -0
  166. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-screen.js.map +1 -0
  167. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-state.d.ts +166 -0
  168. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-state.d.ts.map +1 -0
  169. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-state.js +207 -0
  170. package/dist/cli/backend/src/services/runtime-fallback/usage-limit-state.js.map +1 -0
  171. package/dist/cli/backend/src/types/index.d.ts +12 -0
  172. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  173. package/dist/cli/backend/src/types/index.js.map +1 -1
  174. package/dist/cli/backend/src/types/team-template.types.d.ts +1 -0
  175. package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
  176. package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
  177. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"usage-limit-rules.js","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-fallback/usage-limit-rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usage-limit-rules.js","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-fallback/usage-limit-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Read an agent's screen for a usage-limit state, record it, and answer
3
+ * Claude Code's usage-limit menu.
4
+ *
5
+ * One entry point ({@link inspectUsageLimitScreen}) for every place that
6
+ * already reads an agent's screen: the login/screen monitor's 30s sweep, the
7
+ * orchestrator heartbeat, and the delivery wait for a prompt. Detection is
8
+ * {@link detectUsageLimitScreen}; the state is {@link markUsageLimited}.
9
+ *
10
+ * The menu ("❯ 1. Stop and wait for limit to reset / 2. Wait here, then
11
+ * continue automatically at 8pm") is answered with option 2, like the other
12
+ * known start-up prompts are answered with the one right choice for an
13
+ * unattended agent: the turn waits and goes on by itself at the reset, so
14
+ * nobody has to come back and re-send it. Only while option 1 or 2 is the
15
+ * highlighted one, once per state, and Enter is pressed only after the
16
+ * screen shows option 2 highlighted.
17
+ *
18
+ * @module services/runtime-fallback/usage-limit-screen
19
+ */
20
+ import { type UsageLimitedInfo } from './usage-limit-state.js';
21
+ /** Keys and screen access, to answer the menu. */
22
+ export interface UsageLimitMenuIO {
23
+ sendKey(sessionName: string, key: string): Promise<void>;
24
+ sendEnter(sessionName: string): Promise<void>;
25
+ /** Current screen of the session */
26
+ capture(sessionName: string): string;
27
+ }
28
+ /** Minimal logger. */
29
+ export interface UsageLimitScreenLogger {
30
+ info(message: string, context?: Record<string, unknown>): void;
31
+ warn(message: string, context?: Record<string, unknown>): void;
32
+ }
33
+ /** Options of {@link inspectUsageLimitScreen}. */
34
+ export interface InspectUsageLimitOptions {
35
+ /** Keys + capture; without it the menu is left alone */
36
+ io?: UsageLimitMenuIO;
37
+ logger?: UsageLimitScreenLogger;
38
+ now?: number;
39
+ /** Zone for reset clock times that name none */
40
+ timeZone?: string;
41
+ /** Hand a new detection to the runtime fallback (default true) */
42
+ reportToFallback?: boolean;
43
+ }
44
+ /**
45
+ * Look at a session's screen for a usage-limit state. On a match the state
46
+ * is recorded (a new one is logged and handed to the runtime fallback, which
47
+ * may move the agent to another runtime) and an open usage-limit menu is
48
+ * answered. Never throws.
49
+ *
50
+ * @param sessionName - Session
51
+ * @param screen - Captured screen
52
+ * @param runtime - Runtime the session runs (null when unknown: nothing is detected)
53
+ * @param options - Keys, logger, clock
54
+ * @returns The state in force (also one recorded earlier), or null
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * const limited = await inspectUsageLimitScreen('crewly-orc', screen, 'claude-code', { io });
59
+ * if (limited) return; // do not restart / wait / write
60
+ * ```
61
+ */
62
+ export declare function inspectUsageLimitScreen(sessionName: string, screen: string, runtime: string | null, options?: InspectUsageLimitOptions): Promise<UsageLimitedInfo | null>;
63
+ //# sourceMappingURL=usage-limit-screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-limit-screen.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-fallback/usage-limit-screen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,OAAO,EAA8D,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE3H,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAChC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,oCAAoC;IACpC,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;CACrC;AAED,sBAAsB;AACtB,MAAM,WAAW,sBAAsB;IACtC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC/D;AAED,kDAAkD;AAClD,MAAM,WAAW,wBAAwB;IACxC,wDAAwD;IACxD,EAAE,CAAC,EAAE,gBAAgB,CAAC;IACtB,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC3B;AAwBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,uBAAuB,CAC5C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,OAAO,GAAE,wBAA6B,GACpC,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAwClC"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Read an agent's screen for a usage-limit state, record it, and answer
3
+ * Claude Code's usage-limit menu.
4
+ *
5
+ * One entry point ({@link inspectUsageLimitScreen}) for every place that
6
+ * already reads an agent's screen: the login/screen monitor's 30s sweep, the
7
+ * orchestrator heartbeat, and the delivery wait for a prompt. Detection is
8
+ * {@link detectUsageLimitScreen}; the state is {@link markUsageLimited}.
9
+ *
10
+ * The menu ("❯ 1. Stop and wait for limit to reset / 2. Wait here, then
11
+ * continue automatically at 8pm") is answered with option 2, like the other
12
+ * known start-up prompts are answered with the one right choice for an
13
+ * unattended agent: the turn waits and goes on by itself at the reset, so
14
+ * nobody has to come back and re-send it. Only while option 1 or 2 is the
15
+ * highlighted one, once per state, and Enter is pressed only after the
16
+ * screen shows option 2 highlighted.
17
+ *
18
+ * @module services/runtime-fallback/usage-limit-screen
19
+ */
20
+ import { USAGE_LIMIT_STATE_CONSTANTS } from '../../constants.js';
21
+ import { delay } from '../../utils/async.utils.js';
22
+ import { reportRuntimeOutput } from './effective-runtime.js';
23
+ import { detectUsageLimitScreen } from './usage-limit-rules.js';
24
+ import { markUsageLimited, noteUsageLimitMenuAnswered, usageLimitOf } from './usage-limit-state.js';
25
+ /** `❯` on option 2 of the usage-limit menu. */
26
+ const OPTION_2_SELECTED = /❯\s*2\.\s*Wait\s*here/i;
27
+ /**
28
+ * Answer the usage-limit menu with option 2 ("Wait here, then continue
29
+ * automatically"). Down + check + Enter from option 1; Enter from option 2.
30
+ *
31
+ * @param sessionName - Session
32
+ * @param selected - Highlighted option
33
+ * @param io - Keys + capture
34
+ * @returns True when Enter was pressed on option 2
35
+ */
36
+ async function answerMenu(sessionName, selected, io) {
37
+ if (selected === 1) {
38
+ await io.sendKey(sessionName, 'Down');
39
+ await delay(USAGE_LIMIT_STATE_CONSTANTS.MENU_KEY_DELAY_MS);
40
+ if (!OPTION_2_SELECTED.test(io.capture(sessionName)))
41
+ return false;
42
+ }
43
+ await io.sendEnter(sessionName);
44
+ return true;
45
+ }
46
+ /**
47
+ * Look at a session's screen for a usage-limit state. On a match the state
48
+ * is recorded (a new one is logged and handed to the runtime fallback, which
49
+ * may move the agent to another runtime) and an open usage-limit menu is
50
+ * answered. Never throws.
51
+ *
52
+ * @param sessionName - Session
53
+ * @param screen - Captured screen
54
+ * @param runtime - Runtime the session runs (null when unknown: nothing is detected)
55
+ * @param options - Keys, logger, clock
56
+ * @returns The state in force (also one recorded earlier), or null
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * const limited = await inspectUsageLimitScreen('crewly-orc', screen, 'claude-code', { io });
61
+ * if (limited) return; // do not restart / wait / write
62
+ * ```
63
+ */
64
+ export async function inspectUsageLimitScreen(sessionName, screen, runtime, options = {}) {
65
+ const now = options.now ?? Date.now();
66
+ try {
67
+ const match = runtime ? detectUsageLimitScreen(screen, runtime, now, options.timeZone) : null;
68
+ if (!match)
69
+ return usageLimitOf(sessionName, now);
70
+ const { info, isNew } = markUsageLimited({ sessionName, runtime, ruleId: match.ruleId, resetAt: match.resetAt, source: match.menu ? 'menu' : 'screen' }, now);
71
+ if (isNew) {
72
+ options.logger?.warn('Agent runtime is out of usage — no restarts or deliveries until it resets', {
73
+ sessionName,
74
+ runtime,
75
+ rule: match.ruleId,
76
+ until: info.until ?? null,
77
+ retryAt: info.retryAt,
78
+ menu: match.menu !== null,
79
+ });
80
+ // The screen is live (bottom of it, a plausible reset): the fallback may
81
+ // move the agent to another runtime meanwhile.
82
+ if (options.reportToFallback !== false && runtime)
83
+ reportRuntimeOutput(sessionName, runtime, screen, 'output');
84
+ }
85
+ const selected = match.menu?.selected;
86
+ if (options.io && selected && !info.menuAnsweredAt) {
87
+ // Once per state: a menu that comes back is not pressed into again.
88
+ noteUsageLimitMenuAnswered(sessionName, now);
89
+ const answered = await answerMenu(sessionName, selected, options.io);
90
+ if (answered) {
91
+ options.logger?.info('Answered the usage-limit menu: wait and continue automatically at the reset', { sessionName, until: info.until ?? null });
92
+ }
93
+ else {
94
+ options.logger?.warn('Usage-limit menu: could not select "Wait here, then continue automatically"; left as is', { sessionName });
95
+ }
96
+ }
97
+ return info;
98
+ }
99
+ catch (err) {
100
+ options.logger?.warn('Usage-limit screen check failed (ignored)', { sessionName, error: err instanceof Error ? err.message : String(err) });
101
+ return usageLimitOf(sessionName, now);
102
+ }
103
+ }
104
+ //# sourceMappingURL=usage-limit-screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-limit-screen.js","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-fallback/usage-limit-screen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Usage-limit state per agent session — "this agent's runtime is out of
3
+ * usage until …". Process-wide and dependency-free (like the spend-cap gate)
4
+ * so the hot paths can ask it cheaply: the orchestrator restart service and
5
+ * heartbeat monitor (no restarts while limited), delivery (no waiting on a
6
+ * prompt that will not come, messages held), dispatch, and the status APIs.
7
+ *
8
+ * Why (2026-10-16): the orchestrator sat on Claude Code's weekly-limit menu
9
+ * for ~38 hours. Crewly kept waiting for its prompt every ~17s, restarted it
10
+ * 12 times in 15 minutes, and `GET /api/orchestrator/status` said "active and
11
+ * ready" the whole time.
12
+ *
13
+ * Fed by the login/screen monitor (screen sweep + live output) through
14
+ * {@link markUsageLimited}. A state lifts on its own at the reset time (plus
15
+ * a short grace), or after {@link USAGE_LIMIT_STATE_CONSTANTS.NO_RESET_BACKOFF_MS}
16
+ * when no reset time was given; it is set again if the limit is still there.
17
+ * It is lifted early ({@link liftUsageLimit}) as soon as the agent works
18
+ * again: a finished turn or tool call (Claude Code hooks), or fresh live
19
+ * output that is not a limit message.
20
+ * It is held in memory only: it describes the live screen, and after a Crewly
21
+ * restart the screen is read again.
22
+ *
23
+ * Distinct from the runtime fallback's account-wide "exhausted runtime"
24
+ * record: that one moves agents to another runtime; this one says what a
25
+ * given session is doing right now. A session moved to another runtime is
26
+ * cleared ({@link clearUsageLimit}).
27
+ *
28
+ * @module services/runtime-fallback/usage-limit-state
29
+ */
30
+ /** Where a usage-limit state was seen. */
31
+ export type UsageLimitSource = 'menu' | 'screen' | 'output';
32
+ /** A session that is out of usage. */
33
+ export interface UsageLimitedInfo {
34
+ /** Agent session */
35
+ sessionName: string;
36
+ /** Runtime that is out of usage (null when unknown) */
37
+ runtime: string | null;
38
+ /** Detection rule (logs only) */
39
+ ruleId: string;
40
+ /** Where it was seen */
41
+ source: UsageLimitSource;
42
+ /** ISO time of first detection */
43
+ detectedAt: string;
44
+ /** ISO time the limit was last seen (every detection refreshes it) */
45
+ lastSeenAt: string;
46
+ /** ISO time the runtime says the limit resets, when it says so */
47
+ until?: string;
48
+ /** ISO time the session may be tried again (reset + grace, or the backoff) */
49
+ retryAt: string;
50
+ /** ISO time Crewly answered the usage-limit menu, when it did */
51
+ menuAnsweredAt?: string;
52
+ }
53
+ /** Input of {@link markUsageLimited}. */
54
+ export interface MarkUsageLimitedInput {
55
+ sessionName: string;
56
+ runtime: string | null;
57
+ ruleId: string;
58
+ /** Reset time (epoch ms), or null when unknown */
59
+ resetAt: number | null;
60
+ source: UsageLimitSource;
61
+ }
62
+ /** API view of a usage-limited session (the `usageLimited` status field). */
63
+ export interface UsageLimitedView {
64
+ /** ISO reset time, when known */
65
+ until?: string;
66
+ /** ISO time Crewly tries the session again */
67
+ retryAt: string;
68
+ /** ISO time of first detection */
69
+ detectedAt: string;
70
+ /** Runtime that is out of usage */
71
+ runtime: string | null;
72
+ }
73
+ /**
74
+ * Record that a session is out of usage. A state already in force keeps its
75
+ * first-detection time; a reset time seen later replaces the backoff, and a
76
+ * later detection without one does not extend it.
77
+ *
78
+ * @param input - Session, runtime, rule, reset time, source
79
+ * @param now - Current time (ms)
80
+ * @returns The state and whether it is new (not in force before this call)
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * markUsageLimited({ sessionName: 'crewly-orc', runtime: 'claude-code', ruleId: 'claude.hit_your_limit', resetAt, source: 'menu' });
85
+ * ```
86
+ */
87
+ export declare function markUsageLimited(input: MarkUsageLimitedInput, now?: number): {
88
+ info: UsageLimitedInfo;
89
+ isNew: boolean;
90
+ };
91
+ /**
92
+ * The usage-limit state in force for a session. A state past its retry time
93
+ * is dropped. Never throws.
94
+ *
95
+ * @param sessionName - Agent session
96
+ * @param now - Current time (ms)
97
+ * @returns The state, or null when the session may run
98
+ */
99
+ export declare function usageLimitOf(sessionName: string, now?: number): UsageLimitedInfo | null;
100
+ /**
101
+ * Milliseconds until a usage-limited session may be tried again.
102
+ *
103
+ * @param info - The state
104
+ * @param now - Current time (ms)
105
+ * @returns Milliseconds (at least 0)
106
+ */
107
+ export declare function usageLimitRemainingMs(info: UsageLimitedInfo, now?: number): number;
108
+ /**
109
+ * Note that Crewly answered the usage-limit menu of a session.
110
+ *
111
+ * @param sessionName - Agent session
112
+ * @param now - Current time (ms)
113
+ */
114
+ export declare function noteUsageLimitMenuAnswered(sessionName: string, now?: number): void;
115
+ /**
116
+ * Forget a session's usage-limit state (it moved to another runtime, or the
117
+ * owner changed its runtime).
118
+ *
119
+ * @param sessionName - Agent session
120
+ * @returns True when a state was in force
121
+ */
122
+ export declare function clearUsageLimit(sessionName: string): boolean;
123
+ /**
124
+ * Lift a session's usage-limit state because the agent works again: it
125
+ * finished a turn, or wrote fresh output that is not a limit message.
126
+ * Activity within {@link USAGE_LIMIT_STATE_CONSTANTS.LIFT_GRACE_MS} of the
127
+ * limit last being seen, or of Crewly answering its menu, is the repaint of
128
+ * that screen and does not count.
129
+ *
130
+ * @param sessionName - Agent session
131
+ * @param now - Current time (ms)
132
+ * @returns The lifted state, or null when none was in force or it was too soon
133
+ *
134
+ * @example
135
+ * ```ts
136
+ * if (liftUsageLimit('crewly-orc')) logger.info('Orchestrator works again');
137
+ * ```
138
+ */
139
+ export declare function liftUsageLimit(sessionName: string, now?: number): UsageLimitedInfo | null;
140
+ /**
141
+ * Every session that is usage-limited now.
142
+ *
143
+ * @param now - Current time (ms)
144
+ * @returns States
145
+ */
146
+ export declare function listUsageLimited(now?: number): UsageLimitedInfo[];
147
+ /**
148
+ * The status-API view of a session's state (`usageLimited`), or undefined.
149
+ *
150
+ * @param sessionName - Agent session
151
+ * @param now - Current time (ms)
152
+ * @returns View, or undefined when the session is not limited
153
+ */
154
+ export declare function usageLimitedView(sessionName: string, now?: number): UsageLimitedView | undefined;
155
+ /**
156
+ * One-line, owner-facing reason, e.g. "Orchestrator is out of Claude usage
157
+ * until 2026-10-17T00:00:00.000Z".
158
+ *
159
+ * @param name - Who is limited ("Orchestrator", "Ella")
160
+ * @param info - The state
161
+ * @returns Reason text
162
+ */
163
+ export declare function usageLimitReason(name: string, info: UsageLimitedInfo): string;
164
+ /** Forget every state (tests). */
165
+ export declare function resetUsageLimitState(): void;
166
+ //# sourceMappingURL=usage-limit-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-limit-state.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-fallback/usage-limit-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE5D,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAChC,oBAAoB;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,MAAM,EAAE,gBAAgB,CAAC;IACzB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,yCAAyC;AACzC,MAAM,WAAW,qBAAqB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,gBAAgB,CAAC;CACzB;AAED,6EAA6E;AAC7E,MAAM,WAAW,gBAAgB;IAChC,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAiBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,EAAE,GAAG,GAAE,MAAmB,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CA+BnI;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,gBAAgB,GAAG,IAAI,CAQnG;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAE9F;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,IAAI,CAG9F;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,gBAAgB,GAAG,IAAI,CAOrG;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAmB,GAAG,gBAAgB,EAAE,CAE7E;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,gBAAgB,GAAG,SAAS,CAI5G;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAM7E;AAED,kCAAkC;AAClC,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Usage-limit state per agent session — "this agent's runtime is out of
3
+ * usage until …". Process-wide and dependency-free (like the spend-cap gate)
4
+ * so the hot paths can ask it cheaply: the orchestrator restart service and
5
+ * heartbeat monitor (no restarts while limited), delivery (no waiting on a
6
+ * prompt that will not come, messages held), dispatch, and the status APIs.
7
+ *
8
+ * Why (2026-10-16): the orchestrator sat on Claude Code's weekly-limit menu
9
+ * for ~38 hours. Crewly kept waiting for its prompt every ~17s, restarted it
10
+ * 12 times in 15 minutes, and `GET /api/orchestrator/status` said "active and
11
+ * ready" the whole time.
12
+ *
13
+ * Fed by the login/screen monitor (screen sweep + live output) through
14
+ * {@link markUsageLimited}. A state lifts on its own at the reset time (plus
15
+ * a short grace), or after {@link USAGE_LIMIT_STATE_CONSTANTS.NO_RESET_BACKOFF_MS}
16
+ * when no reset time was given; it is set again if the limit is still there.
17
+ * It is lifted early ({@link liftUsageLimit}) as soon as the agent works
18
+ * again: a finished turn or tool call (Claude Code hooks), or fresh live
19
+ * output that is not a limit message.
20
+ * It is held in memory only: it describes the live screen, and after a Crewly
21
+ * restart the screen is read again.
22
+ *
23
+ * Distinct from the runtime fallback's account-wide "exhausted runtime"
24
+ * record: that one moves agents to another runtime; this one says what a
25
+ * given session is doing right now. A session moved to another runtime is
26
+ * cleared ({@link clearUsageLimit}).
27
+ *
28
+ * @module services/runtime-fallback/usage-limit-state
29
+ */
30
+ import { RUNTIME_FALLBACK_CONSTANTS, USAGE_LIMIT_STATE_CONSTANTS } from '../../constants.js';
31
+ const states = new Map();
32
+ /**
33
+ * When a state with this reset time may be tried again.
34
+ *
35
+ * @param resetAt - Reset time (ms), or null
36
+ * @param now - Current time (ms)
37
+ * @returns Epoch ms
38
+ */
39
+ function retryAtFor(resetAt, now) {
40
+ return resetAt !== null
41
+ ? resetAt + USAGE_LIMIT_STATE_CONSTANTS.RESET_GRACE_MS
42
+ : now + USAGE_LIMIT_STATE_CONSTANTS.NO_RESET_BACKOFF_MS;
43
+ }
44
+ /**
45
+ * Record that a session is out of usage. A state already in force keeps its
46
+ * first-detection time; a reset time seen later replaces the backoff, and a
47
+ * later detection without one does not extend it.
48
+ *
49
+ * @param input - Session, runtime, rule, reset time, source
50
+ * @param now - Current time (ms)
51
+ * @returns The state and whether it is new (not in force before this call)
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * markUsageLimited({ sessionName: 'crewly-orc', runtime: 'claude-code', ruleId: 'claude.hit_your_limit', resetAt, source: 'menu' });
56
+ * ```
57
+ */
58
+ export function markUsageLimited(input, now = Date.now()) {
59
+ const existing = usageLimitOf(input.sessionName, now);
60
+ // A reset in the past or implausibly far ahead (an old dated message read
61
+ // as next year's) is not trusted: back off instead.
62
+ const resetAt = input.resetAt !== null && input.resetAt > now && input.resetAt - now <= USAGE_LIMIT_STATE_CONSTANTS.MAX_RESET_AHEAD_MS
63
+ ? input.resetAt
64
+ : null;
65
+ const until = resetAt !== null ? new Date(resetAt).toISOString() : undefined;
66
+ if (existing) {
67
+ if (until && existing.until !== until) {
68
+ existing.until = until;
69
+ existing.retryAt = new Date(retryAtFor(resetAt, now)).toISOString();
70
+ }
71
+ if (input.runtime && !existing.runtime)
72
+ existing.runtime = input.runtime;
73
+ if (input.source === 'menu')
74
+ existing.source = 'menu';
75
+ existing.lastSeenAt = new Date(now).toISOString();
76
+ return { info: existing, isNew: false };
77
+ }
78
+ const info = {
79
+ sessionName: input.sessionName,
80
+ runtime: input.runtime,
81
+ ruleId: input.ruleId,
82
+ source: input.source,
83
+ detectedAt: new Date(now).toISOString(),
84
+ lastSeenAt: new Date(now).toISOString(),
85
+ ...(until ? { until } : {}),
86
+ retryAt: new Date(retryAtFor(resetAt, now)).toISOString(),
87
+ };
88
+ states.set(input.sessionName, info);
89
+ return { info, isNew: true };
90
+ }
91
+ /**
92
+ * The usage-limit state in force for a session. A state past its retry time
93
+ * is dropped. Never throws.
94
+ *
95
+ * @param sessionName - Agent session
96
+ * @param now - Current time (ms)
97
+ * @returns The state, or null when the session may run
98
+ */
99
+ export function usageLimitOf(sessionName, now = Date.now()) {
100
+ const info = states.get(sessionName);
101
+ if (!info)
102
+ return null;
103
+ if (Date.parse(info.retryAt) <= now) {
104
+ states.delete(sessionName);
105
+ return null;
106
+ }
107
+ return info;
108
+ }
109
+ /**
110
+ * Milliseconds until a usage-limited session may be tried again.
111
+ *
112
+ * @param info - The state
113
+ * @param now - Current time (ms)
114
+ * @returns Milliseconds (at least 0)
115
+ */
116
+ export function usageLimitRemainingMs(info, now = Date.now()) {
117
+ return Math.max(0, Date.parse(info.retryAt) - now);
118
+ }
119
+ /**
120
+ * Note that Crewly answered the usage-limit menu of a session.
121
+ *
122
+ * @param sessionName - Agent session
123
+ * @param now - Current time (ms)
124
+ */
125
+ export function noteUsageLimitMenuAnswered(sessionName, now = Date.now()) {
126
+ const info = usageLimitOf(sessionName, now);
127
+ if (info)
128
+ info.menuAnsweredAt = new Date(now).toISOString();
129
+ }
130
+ /**
131
+ * Forget a session's usage-limit state (it moved to another runtime, or the
132
+ * owner changed its runtime).
133
+ *
134
+ * @param sessionName - Agent session
135
+ * @returns True when a state was in force
136
+ */
137
+ export function clearUsageLimit(sessionName) {
138
+ return states.delete(sessionName);
139
+ }
140
+ /**
141
+ * Lift a session's usage-limit state because the agent works again: it
142
+ * finished a turn, or wrote fresh output that is not a limit message.
143
+ * Activity within {@link USAGE_LIMIT_STATE_CONSTANTS.LIFT_GRACE_MS} of the
144
+ * limit last being seen, or of Crewly answering its menu, is the repaint of
145
+ * that screen and does not count.
146
+ *
147
+ * @param sessionName - Agent session
148
+ * @param now - Current time (ms)
149
+ * @returns The lifted state, or null when none was in force or it was too soon
150
+ *
151
+ * @example
152
+ * ```ts
153
+ * if (liftUsageLimit('crewly-orc')) logger.info('Orchestrator works again');
154
+ * ```
155
+ */
156
+ export function liftUsageLimit(sessionName, now = Date.now()) {
157
+ const info = usageLimitOf(sessionName, now);
158
+ if (!info)
159
+ return null;
160
+ const lastSeen = Math.max(Date.parse(info.lastSeenAt), info.menuAnsweredAt ? Date.parse(info.menuAnsweredAt) : 0);
161
+ if (now - lastSeen < USAGE_LIMIT_STATE_CONSTANTS.LIFT_GRACE_MS)
162
+ return null;
163
+ states.delete(sessionName);
164
+ return info;
165
+ }
166
+ /**
167
+ * Every session that is usage-limited now.
168
+ *
169
+ * @param now - Current time (ms)
170
+ * @returns States
171
+ */
172
+ export function listUsageLimited(now = Date.now()) {
173
+ return [...states.keys()].map((s) => usageLimitOf(s, now)).filter((i) => i !== null);
174
+ }
175
+ /**
176
+ * The status-API view of a session's state (`usageLimited`), or undefined.
177
+ *
178
+ * @param sessionName - Agent session
179
+ * @param now - Current time (ms)
180
+ * @returns View, or undefined when the session is not limited
181
+ */
182
+ export function usageLimitedView(sessionName, now = Date.now()) {
183
+ const info = usageLimitOf(sessionName, now);
184
+ if (!info)
185
+ return undefined;
186
+ return { ...(info.until ? { until: info.until } : {}), retryAt: info.retryAt, detectedAt: info.detectedAt, runtime: info.runtime };
187
+ }
188
+ /**
189
+ * One-line, owner-facing reason, e.g. "Orchestrator is out of Claude usage
190
+ * until 2026-10-17T00:00:00.000Z".
191
+ *
192
+ * @param name - Who is limited ("Orchestrator", "Ella")
193
+ * @param info - The state
194
+ * @returns Reason text
195
+ */
196
+ export function usageLimitReason(name, info) {
197
+ const runtime = info.runtime ? RUNTIME_FALLBACK_CONSTANTS.SHORT_LABELS[info.runtime] ?? info.runtime : null;
198
+ const what = runtime ? `out of ${runtime} usage` : 'out of usage';
199
+ return info.until
200
+ ? `${name} is ${what} until ${info.until}`
201
+ : `${name} is ${what} (reset time unknown; trying again at ${info.retryAt})`;
202
+ }
203
+ /** Forget every state (tests). */
204
+ export function resetUsageLimitState() {
205
+ states.clear();
206
+ }
207
+ //# sourceMappingURL=usage-limit-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-limit-state.js","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-fallback/usage-limit-state.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"workitem-dispatch.subscriber.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/workitem-dispatch.subscriber.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workitem-dispatch.subscriber.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/workitem-dispatch.subscriber.ts"],"names":[],"mappings":"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"}
@@ -52,6 +52,7 @@ import { TaskPoolService } from '../task-pool/task-pool.service.js';
52
52
  import { getLocalApiBaseUrl } from '../../utils/local-api-url.utils.js';
53
53
  import { DIRECT_DELIVERY_CONSTANTS, ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
54
54
  import { spendCapStopOf } from '../spend/spend-cap.gate.js';
55
+ import { usageLimitOf } from '../runtime-fallback/usage-limit-state.js';
55
56
  import { SubAgentMessageQueue } from '../messaging/sub-agent-message-queue.service.js';
56
57
  import { FreshTaskConversationService, freshConversationNote, } from '../agent/fresh-task-conversation.service.js';
57
58
  import { traceHarness, workItemTraceMarker } from '../trace/trace-recorder.js';
@@ -478,6 +479,18 @@ export class WorkItemDispatchSubscriber {
478
479
  });
479
480
  return { status: 'held', reason: 'over its daily token cap' };
480
481
  }
482
+ // Out of usage (e.g. Claude Code's weekly limit): the write would only
483
+ // be queued. Keep the item queued (not dispatched) until the reset.
484
+ const usageLimit = usageLimitOf(workItem.target);
485
+ if (usageLimit) {
486
+ this.logger.info('Dispatch skipped — target is out of usage', {
487
+ workItemId: workItem.id,
488
+ target: workItem.target,
489
+ until: usageLimit.until ?? null,
490
+ retryAt: usageLimit.retryAt,
491
+ });
492
+ return { status: 'held', reason: 'out of usage' };
493
+ }
481
494
  // Team budget gate: do not wake an agent whose team is over budget. The
482
495
  // WI stays queued (not marked dispatched) so it is picked up once the
483
496
  // window resets or the budget is raised. Fail-open on gate errors.