crewly 1.20.187 → 1.20.188

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 (141) hide show
  1. package/config/skills/agent/core/project-tickets/SKILL.md +3 -2
  2. package/config/skills/agent/core/project-tickets/execute.sh +4 -4
  3. package/config/skills/agent/core/project-tickets/execute.test.sh +2 -2
  4. package/dist/backend/backend/src/constants.d.ts +70 -12
  5. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  6. package/dist/backend/backend/src/constants.js +70 -12
  7. package/dist/backend/backend/src/constants.js.map +1 -1
  8. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +1 -1
  9. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
  10. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +5 -1
  11. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
  12. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts +1 -1
  13. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js +1 -1
  14. package/dist/backend/backend/src/controllers/system/usage.controller.d.ts +46 -0
  15. package/dist/backend/backend/src/controllers/system/usage.controller.d.ts.map +1 -0
  16. package/dist/backend/backend/src/controllers/system/usage.controller.js +181 -0
  17. package/dist/backend/backend/src/controllers/system/usage.controller.js.map +1 -0
  18. package/dist/backend/backend/src/index.d.ts +7 -0
  19. package/dist/backend/backend/src/index.d.ts.map +1 -1
  20. package/dist/backend/backend/src/index.js +59 -4
  21. package/dist/backend/backend/src/index.js.map +1 -1
  22. package/dist/backend/backend/src/routes/modules/system.routes.js +3 -3
  23. package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -1
  24. package/dist/backend/backend/src/services/agent/agent-registration.service.js +7 -7
  25. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  26. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts +4 -2
  27. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
  28. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js +6 -1
  29. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
  30. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +2 -2
  31. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  32. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +4 -2
  33. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  34. package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.d.ts +130 -0
  35. package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.d.ts.map +1 -0
  36. package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.js +274 -0
  37. package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.js.map +1 -0
  38. package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.d.ts +152 -0
  39. package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.d.ts.map +1 -0
  40. package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.js +311 -0
  41. package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.js.map +1 -0
  42. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +53 -1
  43. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  44. package/dist/backend/backend/src/services/monitoring/token-usage.service.js +51 -3
  45. package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  46. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts +4 -4
  47. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
  48. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +1 -1
  49. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
  50. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts +4 -3
  51. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts.map +1 -1
  52. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js +7 -4
  53. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js.map +1 -1
  54. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts +40 -9
  55. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
  56. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +68 -20
  57. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
  58. package/dist/backend/backend/src/services/spend/spend-cap-command.d.ts +48 -18
  59. package/dist/backend/backend/src/services/spend/spend-cap-command.d.ts.map +1 -1
  60. package/dist/backend/backend/src/services/spend/spend-cap-command.js +195 -62
  61. package/dist/backend/backend/src/services/spend/spend-cap-command.js.map +1 -1
  62. package/dist/backend/backend/src/services/spend/spend-cap.gate.d.ts +11 -15
  63. package/dist/backend/backend/src/services/spend/spend-cap.gate.d.ts.map +1 -1
  64. package/dist/backend/backend/src/services/spend/spend-cap.gate.js +8 -13
  65. package/dist/backend/backend/src/services/spend/spend-cap.gate.js.map +1 -1
  66. package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts +179 -64
  67. package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts.map +1 -1
  68. package/dist/backend/backend/src/services/spend/spend-cap.service.js +406 -149
  69. package/dist/backend/backend/src/services/spend/spend-cap.service.js.map +1 -1
  70. package/dist/backend/backend/src/services/spend/spend-cap.store.d.ts +52 -11
  71. package/dist/backend/backend/src/services/spend/spend-cap.store.d.ts.map +1 -1
  72. package/dist/backend/backend/src/services/spend/spend-cap.store.js +67 -21
  73. package/dist/backend/backend/src/services/spend/spend-cap.store.js.map +1 -1
  74. package/dist/backend/backend/src/services/spend/spend-cap.wiring.d.ts +3 -1
  75. package/dist/backend/backend/src/services/spend/spend-cap.wiring.d.ts.map +1 -1
  76. package/dist/backend/backend/src/services/spend/spend-cap.wiring.js +21 -7
  77. package/dist/backend/backend/src/services/spend/spend-cap.wiring.js.map +1 -1
  78. package/dist/backend/backend/src/services/spend/spend-ledger.service.d.ts +57 -36
  79. package/dist/backend/backend/src/services/spend/spend-ledger.service.d.ts.map +1 -1
  80. package/dist/backend/backend/src/services/spend/spend-ledger.service.js +80 -55
  81. package/dist/backend/backend/src/services/spend/spend-ledger.service.js.map +1 -1
  82. package/dist/backend/backend/src/services/task-pool/work-item-usage.d.ts +10 -1
  83. package/dist/backend/backend/src/services/task-pool/work-item-usage.d.ts.map +1 -1
  84. package/dist/backend/backend/src/services/task-pool/work-item-usage.js +2 -0
  85. package/dist/backend/backend/src/services/task-pool/work-item-usage.js.map +1 -1
  86. package/dist/backend/backend/src/services/usage/token-format.d.ts +49 -0
  87. package/dist/backend/backend/src/services/usage/token-format.d.ts.map +1 -0
  88. package/dist/backend/backend/src/services/usage/token-format.js +81 -0
  89. package/dist/backend/backend/src/services/usage/token-format.js.map +1 -0
  90. package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts +132 -0
  91. package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts.map +1 -0
  92. package/dist/backend/backend/src/services/usage/usage-stats.service.js +226 -0
  93. package/dist/backend/backend/src/services/usage/usage-stats.service.js.map +1 -0
  94. package/dist/backend/backend/src/types/decision.types.d.ts +2 -2
  95. package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts +24 -7
  96. package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
  97. package/dist/backend/backend/src/types/ticket-autopilot.types.js +29 -13
  98. package/dist/backend/backend/src/types/ticket-autopilot.types.js.map +1 -1
  99. package/dist/backend/build-info.json +2 -2
  100. package/dist/cli/backend/src/constants.d.ts +70 -12
  101. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  102. package/dist/cli/backend/src/constants.js +70 -12
  103. package/dist/cli/backend/src/constants.js.map +1 -1
  104. package/dist/cli/backend/src/services/agent/agent-registration.service.js +7 -7
  105. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  106. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts +4 -2
  107. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
  108. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js +6 -1
  109. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
  110. package/dist/cli/backend/src/services/messaging/queue-processor.service.js +2 -2
  111. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  112. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +4 -2
  113. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  114. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +53 -1
  115. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  116. package/dist/cli/backend/src/services/monitoring/token-usage.service.js +51 -3
  117. package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  118. package/dist/cli/backend/src/services/spend/spend-cap.gate.d.ts +11 -15
  119. package/dist/cli/backend/src/services/spend/spend-cap.gate.d.ts.map +1 -1
  120. package/dist/cli/backend/src/services/spend/spend-cap.gate.js +8 -13
  121. package/dist/cli/backend/src/services/spend/spend-cap.gate.js.map +1 -1
  122. package/dist/cli/backend/src/services/task-pool/work-item-usage.d.ts +10 -1
  123. package/dist/cli/backend/src/services/task-pool/work-item-usage.d.ts.map +1 -1
  124. package/dist/cli/backend/src/services/task-pool/work-item-usage.js +2 -0
  125. package/dist/cli/backend/src/services/task-pool/work-item-usage.js.map +1 -1
  126. package/dist/cli/backend/src/services/usage/token-format.d.ts +49 -0
  127. package/dist/cli/backend/src/services/usage/token-format.d.ts.map +1 -0
  128. package/dist/cli/backend/src/services/usage/token-format.js +81 -0
  129. package/dist/cli/backend/src/services/usage/token-format.js.map +1 -0
  130. package/dist/cli/backend/src/types/decision.types.d.ts +2 -2
  131. package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts +24 -7
  132. package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
  133. package/dist/cli/backend/src/types/ticket-autopilot.types.js +29 -13
  134. package/dist/cli/backend/src/types/ticket-autopilot.types.js.map +1 -1
  135. package/frontend/dist/assets/{index-15c2faf2.js → index-49f50b45.js} +276 -276
  136. package/frontend/dist/index.html +1 -1
  137. package/package.json +1 -1
  138. package/dist/backend/backend/src/controllers/system/spend.controller.d.ts +0 -32
  139. package/dist/backend/backend/src/controllers/system/spend.controller.d.ts.map +0 -1
  140. package/dist/backend/backend/src/controllers/system/spend.controller.js +0 -100
  141. package/dist/backend/backend/src/controllers/system/spend.controller.js.map +0 -1
@@ -1,12 +1,21 @@
1
1
  /**
2
- * Spend caps from the owner's DM with the orc. Handled by the backend, not
3
- * the orc — so it works while the orc itself is stopped by its cap:
2
+ * Token caps and boosts from the owner's DM with the orc. Handled by the
3
+ * backend, not the orc — so it works while the orc itself is stopped:
4
4
  *
5
- * - `set daily cap for crewly-orc to $5` / `set daily cap for Ella to 3`
6
- * - `set daily cap to $5` (the default for every agent)
7
- * - `set daily total cap to $20` (all agents together)
8
- * - `remove daily cap for Ella` / `remove daily cap` / `remove daily total cap`
9
- * - `raise cap for orc to $10 today` / `raise total cap to $40 today`
5
+ * Caps (amounts in tokens: `5M`, `500k`, `2000万`, `5000000`):
6
+ * - `set daily cap for Ella to 5M` / `set daily cap to 5M` (default per agent)
7
+ * - `set team cap for CE to 50M` / `set daily cap for team CE to 50M`
8
+ * - `set daily total cap to 200M` (all agents together)
9
+ * - `remove daily cap for Ella` / `remove team cap for CE` / `remove daily cap` / `remove daily total cap`
10
+ *
11
+ * Boosts (until local midnight):
12
+ * - `boost CE by 20M today` / `boost Ella by 5M` / `boost everyone by 10M today`
13
+ * - `unlimited today for everyone` / `unlimited today for CE` / `CE unlimited today`
14
+ * - `放开 CE 今天` / `今天放开 CE` / `今天全部放开` / `给 CE 加 20M` / `CE 今天加 2000万`
15
+ *
16
+ * A target is everyone, a team (by name) or an agent (by name / session);
17
+ * a name that is both a team and an agent means the team. Replies are
18
+ * English (harness text rule).
10
19
  *
11
20
  * While the orc is stopped by a cap, every other owner DM to it gets one
12
21
  * harness line saying so (the message itself stays queued for the orc).
@@ -17,34 +26,41 @@
17
26
  */
18
27
  import type { SlackIncomingMessage } from '../../types/slack.types.js';
19
28
  import { type SpendStop } from './spend-cap.gate.js';
20
- import { type SpendCapPatch } from './spend-cap.service.js';
21
- /** A parsed command. */
29
+ import { type BoostInput, type SpendCapPatch } from './spend-cap.service.js';
30
+ /** A parsed command. `target` is the name as typed (resolved later). */
22
31
  export type SpendCapCommand = {
23
32
  kind: 'set';
24
33
  target: string | null;
25
- usd: number;
34
+ team?: boolean;
35
+ tokens: number;
26
36
  } | {
27
37
  kind: 'set_total';
28
- usd: number;
38
+ tokens: number;
29
39
  } | {
30
40
  kind: 'remove';
31
41
  target: string | null;
42
+ team?: boolean;
32
43
  } | {
33
44
  kind: 'remove_total';
34
45
  } | {
35
- kind: 'raise';
46
+ kind: 'boost';
36
47
  target: string;
37
- usd: number;
48
+ tokens: number;
49
+ } | {
50
+ kind: 'unlimited';
51
+ target: string;
52
+ } | {
53
+ kind: 'usd_hint';
38
54
  };
39
55
  /**
40
- * Parse a spend cap command.
56
+ * Parse a cap / boost command.
41
57
  *
42
58
  * @param text - Message text
43
59
  * @returns The command, or null when the message is not one
44
60
  *
45
61
  * @example
46
- * parseSpendCapCommand('set daily cap for crewly-orc to $5') // { kind: 'set', target: 'crewly-orc', usd: 5 }
47
- * parseSpendCapCommand('raise cap for orc to $10 today') // { kind: 'raise', target: 'orc', usd: 10 }
62
+ * parseSpendCapCommand('boost CE by 20M today') // { kind: 'boost', target: 'ce', tokens: 20000000 }
63
+ * parseSpendCapCommand('放开 CE 今天') // { kind: 'unlimited', target: 'ce' }
48
64
  */
49
65
  export declare function parseSpendCapCommand(text: string | undefined): SpendCapCommand | null;
50
66
  /** An agent the owner can name. */
@@ -52,6 +68,11 @@ export interface NamedAgent {
52
68
  session: string;
53
69
  name: string;
54
70
  }
71
+ /** A team the owner can name. */
72
+ export interface NamedTeam {
73
+ id: string;
74
+ name: string;
75
+ }
55
76
  /**
56
77
  * Resolve the agent the owner named.
57
78
  *
@@ -60,6 +81,14 @@ export interface NamedAgent {
60
81
  * @returns Session, or null when unknown / ambiguous
61
82
  */
62
83
  export declare function resolveAgent(who: string, agents: NamedAgent[]): string | null;
84
+ /**
85
+ * Resolve the team the owner named.
86
+ *
87
+ * @param who - Team name or id (`team CE` works too)
88
+ * @param teams - Teams
89
+ * @returns Team, or null when unknown / ambiguous
90
+ */
91
+ export declare function resolveTeam(who: string, teams: NamedTeam[]): NamedTeam | null;
63
92
  /** What the interceptor needs. */
64
93
  export interface SpendCapCommandDeps {
65
94
  /** `orc` when the message is the owner writing in their DM with the orc */
@@ -68,8 +97,9 @@ export interface SpendCapCommandDeps {
68
97
  reply: (text: string, target: unknown) => Promise<unknown>;
69
98
  /** Configured agents (orc included) */
70
99
  agents: () => Promise<NamedAgent[]>;
100
+ teams: () => Promise<NamedTeam[]>;
71
101
  setCaps: (patch: SpendCapPatch) => Promise<unknown>;
72
- raiseToday: (target: string, usd: number) => Promise<number>;
102
+ boost: (input: BoostInput) => Promise<unknown>;
73
103
  /** The orc's stop, or null */
74
104
  orcStop: () => SpendStop | null;
75
105
  onError?: (err: unknown) => void;
@@ -88,7 +118,7 @@ export declare function orcCappedReply(stop: SpendStop): string;
88
118
  * @param deps - Collaborators
89
119
  * @returns The owner's one-line answer
90
120
  */
91
- export declare function runSpendCapCommand(cmd: SpendCapCommand, deps: Pick<SpendCapCommandDeps, 'agents' | 'setCaps' | 'raiseToday'>): Promise<string>;
121
+ export declare function runSpendCapCommand(cmd: SpendCapCommand, deps: Pick<SpendCapCommandDeps, 'agents' | 'teams' | 'setCaps' | 'boost'>): Promise<string>;
92
122
  /**
93
123
  * The Slack bridge interceptor for the owner's orc DM.
94
124
  *
@@ -1 +1 @@
1
- {"version":3,"file":"spend-cap-command.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5E,wBAAwB;AACxB,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAsBnD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,GAAG,IAAI,CAmBrF;AAED,mCAAmC;AACnC,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,GAAG,IAAI,CAO7E;AAED,kCAAkC;AAClC,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,YAAY,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC;IACxE,aAAa,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC;IAC1D,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,uCAAuC;IACvC,MAAM,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACpC,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7D,8BAA8B;IAC9B,OAAO,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAItD;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA8CpJ;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,mBAAmB,GAAG,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAqB/G"}
1
+ {"version":3,"file":"spend-cap-command.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap-command.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,21 @@
1
1
  /**
2
- * Spend caps from the owner's DM with the orc. Handled by the backend, not
3
- * the orc — so it works while the orc itself is stopped by its cap:
2
+ * Token caps and boosts from the owner's DM with the orc. Handled by the
3
+ * backend, not the orc — so it works while the orc itself is stopped:
4
4
  *
5
- * - `set daily cap for crewly-orc to $5` / `set daily cap for Ella to 3`
6
- * - `set daily cap to $5` (the default for every agent)
7
- * - `set daily total cap to $20` (all agents together)
8
- * - `remove daily cap for Ella` / `remove daily cap` / `remove daily total cap`
9
- * - `raise cap for orc to $10 today` / `raise total cap to $40 today`
5
+ * Caps (amounts in tokens: `5M`, `500k`, `2000万`, `5000000`):
6
+ * - `set daily cap for Ella to 5M` / `set daily cap to 5M` (default per agent)
7
+ * - `set team cap for CE to 50M` / `set daily cap for team CE to 50M`
8
+ * - `set daily total cap to 200M` (all agents together)
9
+ * - `remove daily cap for Ella` / `remove team cap for CE` / `remove daily cap` / `remove daily total cap`
10
+ *
11
+ * Boosts (until local midnight):
12
+ * - `boost CE by 20M today` / `boost Ella by 5M` / `boost everyone by 10M today`
13
+ * - `unlimited today for everyone` / `unlimited today for CE` / `CE unlimited today`
14
+ * - `放开 CE 今天` / `今天放开 CE` / `今天全部放开` / `给 CE 加 20M` / `CE 今天加 2000万`
15
+ *
16
+ * A target is everyone, a team (by name) or an agent (by name / session);
17
+ * a name that is both a team and an agent means the team. Replies are
18
+ * English (harness text rule).
10
19
  *
11
20
  * While the orc is stopped by a cap, every other owner DM to it gets one
12
21
  * harness line saying so (the message itself stays queued for the orc).
@@ -15,11 +24,28 @@
15
24
  *
16
25
  * @module services/spend/spend-cap-command
17
26
  */
18
- import { ORCHESTRATOR_SESSION_NAME, SPEND_CAP_CONSTANTS as C } from '../../constants.js';
19
- import { formatUsd, spendCapReason } from './spend-cap.gate.js';
20
- import { suggestedRaise } from './spend-cap.service.js';
21
- const AMOUNT = String.raw `\$?\s*(\d+(?:\.\d{1,2})?)\s*(?:usd|dollars?)?`;
22
- const CAP = String.raw `(?:daily\s+)?(?:spend(?:ing)?\s+)?cap`;
27
+ import { ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
28
+ import { compactTokens, formatTokens, parseTokenAmount } from '../usage/token-format.js';
29
+ import { spendCapReason } from './spend-cap.gate.js';
30
+ import { suggestedBoost } from './spend-cap.service.js';
31
+ /** A name a boost may target from free text: short ASCII, or an "everyone" word. */
32
+ const NAME = /^[a-z0-9][a-z0-9 _.@-]{0,39}$/;
33
+ /**
34
+ * Whether free text after a boost keyword is a plausible target (so an
35
+ * ordinary sentence that happens to start with 放开 / ends with "unlimited
36
+ * today" still goes to the orc).
37
+ *
38
+ * @param who - Candidate target
39
+ * @returns True when it may be a team / agent name or "everyone"
40
+ */
41
+ function plausibleTarget(who) {
42
+ return EVERYONE.has(who) || NAME.test(who);
43
+ }
44
+ /** Words for "everyone". */
45
+ const EVERYONE = new Set(['everyone', 'everybody', 'all', 'all agents', 'every agent', 'the whole crew', 'total', '所有人', '全部', '大家', '所有', '全员', '全部人']);
46
+ const AMOUNT = String.raw `(\d+(?:\.\d+)?\s*(?:k|m|mil|million|b|bn|billion|万|亿)?)(?:\s*tokens?)?`;
47
+ const CAP = String.raw `(?:daily\s+)?(?:token\s+|spend(?:ing)?\s+|usage\s+)?cap`;
48
+ const TODAY = String.raw `(?:\s*(?:for\s+)?today)?`;
23
49
  /**
24
50
  * Normalise a message for matching.
25
51
  *
@@ -32,44 +58,101 @@ function norm(text) {
32
58
  .replace(/[`*_]/g, '')
33
59
  .toLowerCase()
34
60
  .replace(/[\s.。!!~~]+$/u, '')
35
- .replace(/^(?:please|pls)\s+/, '')
61
+ .replace(/^(?:please|pls|请)\s*/u, '')
36
62
  .replace(/\s+/g, ' ')
37
63
  .trim();
38
64
  }
39
65
  /**
40
- * Parse a spend cap command.
66
+ * Amount text → tokens.
67
+ *
68
+ * @param text - e.g. `20m`, `2000万`
69
+ * @returns Tokens, or null
70
+ */
71
+ function amount(text) {
72
+ return parseTokenAmount(text.replace(/\s+/g, ''));
73
+ }
74
+ /**
75
+ * Parse a cap / boost command.
41
76
  *
42
77
  * @param text - Message text
43
78
  * @returns The command, or null when the message is not one
44
79
  *
45
80
  * @example
46
- * parseSpendCapCommand('set daily cap for crewly-orc to $5') // { kind: 'set', target: 'crewly-orc', usd: 5 }
47
- * parseSpendCapCommand('raise cap for orc to $10 today') // { kind: 'raise', target: 'orc', usd: 10 }
81
+ * parseSpendCapCommand('boost CE by 20M today') // { kind: 'boost', target: 'ce', tokens: 20000000 }
82
+ * parseSpendCapCommand('放开 CE 今天') // { kind: 'unlimited', target: 'ce' }
48
83
  */
49
84
  export function parseSpendCapCommand(text) {
50
85
  if (!text)
51
86
  return null;
52
87
  const t = norm(text);
53
- let m = new RegExp(String.raw `^set (?:the )?(?:daily total|total daily|total)(?: spend(?:ing)?)? cap to ${AMOUNT}$`).exec(t);
54
- if (m)
55
- return { kind: 'set_total', usd: Number(m[1]) };
88
+ if (!t)
89
+ return null;
90
+ let m;
91
+ const num = (s) => amount(s);
92
+ // ---- caps
93
+ m = new RegExp(String.raw `^set (?:the )?(?:daily total|total daily|total)(?: token| spend(?:ing)?)? cap to ${AMOUNT}$`).exec(t);
94
+ if (m && num(m[1]))
95
+ return { kind: 'set_total', tokens: num(m[1]) };
96
+ m = new RegExp(String.raw `^set (?:the )?(?:daily )?team (?:token )?cap for (.+?) to ${AMOUNT}(?: (?:a|per) day)?$`).exec(t);
97
+ if (m && num(m[2]))
98
+ return { kind: 'set', target: m[1].trim(), team: true, tokens: num(m[2]) };
99
+ m = new RegExp(String.raw `^set (?:the )?${CAP} for team (.+?) to ${AMOUNT}(?: (?:a|per) day)?$`).exec(t);
100
+ if (m && num(m[2]))
101
+ return { kind: 'set', target: m[1].trim(), team: true, tokens: num(m[2]) };
56
102
  m = new RegExp(String.raw `^set (?:the )?${CAP}(?: for (.+?))? to ${AMOUNT}(?: (?:a|per) day)?$`).exec(t);
57
- if (m)
58
- return { kind: 'set', target: m[1]?.trim() || null, usd: Number(m[2]) };
59
- m = /^(?:remove|clear|turn off|disable) (?:the )?(?:daily total|total daily|total)(?: spend(?:ing)?)? cap$/.exec(t);
103
+ if (m && num(m[2]))
104
+ return { kind: 'set', target: m[1]?.trim() || null, tokens: num(m[2]) };
105
+ m = /^(?:remove|clear|turn off|disable) (?:the )?(?:daily total|total daily|total)(?: token| spend(?:ing)?)? cap$/.exec(t);
60
106
  if (m)
61
107
  return { kind: 'remove_total' };
108
+ m = /^(?:remove|clear|turn off|disable) (?:the )?(?:daily )?team cap for (.+)$/.exec(t) ?? new RegExp(String.raw `^(?:remove|clear|turn off|disable) (?:the )?${CAP} for team (.+)$`).exec(t);
109
+ if (m)
110
+ return { kind: 'remove', target: m[1].trim(), team: true };
62
111
  m = new RegExp(String.raw `^(?:remove|clear|turn off|disable) (?:the )?${CAP}(?: for (.+))?$`).exec(t);
63
112
  if (m)
64
113
  return { kind: 'remove', target: m[1]?.trim() || null };
65
- m = new RegExp(String.raw `^raise (?:the )?(?:daily total|total daily|total)(?: spend(?:ing)?)? cap to ${AMOUNT}(?: (?:for )?today)?$`).exec(t);
114
+ // ---- boosts (English)
115
+ m = new RegExp(String.raw `^boost (.+?) (?:by |\+)\s*${AMOUNT}${TODAY}$`).exec(t);
116
+ if (m && num(m[2]))
117
+ return { kind: 'boost', target: m[1].trim(), tokens: num(m[2]) };
118
+ m = new RegExp(String.raw `^give (.+?) (?:\+)?${AMOUNT} (?:more|extra)${TODAY}$`).exec(t);
119
+ if (m && num(m[2]))
120
+ return { kind: 'boost', target: m[1].trim(), tokens: num(m[2]) };
121
+ m = /^(?:unlimited|no (?:token )?cap|no limit)(?: tokens?)? (?:for )?today(?: for (.+))?$/.exec(t);
66
122
  if (m)
67
- return { kind: 'raise', target: C.TOTAL_TARGET, usd: Number(m[1]) };
68
- m = new RegExp(String.raw `^raise (?:the )?${CAP} for (.+?) to ${AMOUNT}(?: (?:for )?today)?$`).exec(t);
123
+ return { kind: 'unlimited', target: m[1]?.trim() || 'everyone' };
124
+ m = /^(?:unlimited|no (?:token )?cap|no limit) (?:tokens? )?for (.+?)(?: (?:for )?today)?$/.exec(t);
125
+ if (m)
126
+ return { kind: 'unlimited', target: m[1].trim() };
127
+ m = /^(?:lift|remove|drop) (?:the )?(?:daily )?(?:token )?caps? (?:for|on) (.+?) (?:for )?today$/.exec(t);
128
+ if (m)
129
+ return { kind: 'unlimited', target: m[1].trim() };
130
+ m = /^(.+?) unlimited today$/.exec(t);
131
+ if (m && plausibleTarget(m[1].trim()))
132
+ return { kind: 'unlimited', target: m[1].trim() };
133
+ // ---- boosts (Chinese)
134
+ const zh = t.replace(/\s+/g, ' ');
135
+ m = /^(?:今天)?\s*(?:全部|全都|所有人|大家)?\s*放开(?:吧)?\s*(.*?)\s*(?:今天|今日)?(?:吧)?$/u.exec(zh);
69
136
  if (m) {
70
- const target = m[1].trim();
71
- return { kind: 'raise', target: ['total', 'all', 'all agents'].includes(target) ? C.TOTAL_TARGET : target, usd: Number(m[2]) };
137
+ const who = m[1].trim();
138
+ const all = /^(?:今天|今日)?\s*(?:全部|全都|所有人|大家)/u.test(zh) || EVERYONE.has(who) || who === '';
139
+ if (all)
140
+ return { kind: 'unlimited', target: 'everyone' };
141
+ if (plausibleTarget(who))
142
+ return { kind: 'unlimited', target: who };
72
143
  }
144
+ m = /^(.+?)\s*(?:今天|今日)\s*(?:不限|不封顶|放开)$/u.exec(zh);
145
+ if (m && plausibleTarget(m[1].trim()))
146
+ return { kind: 'unlimited', target: m[1].trim() };
147
+ m = new RegExp(String.raw `^(?:今天)?\s*给\s*(.+?)\s*(?:今天)?\s*(?:加|多加|增加)\s*${AMOUNT}$`, 'u').exec(zh);
148
+ if (m && num(m[2]) && plausibleTarget(m[1].trim()))
149
+ return { kind: 'boost', target: m[1].trim(), tokens: num(m[2]) };
150
+ m = new RegExp(String.raw `^(.+?)\s*(?:今天|今日)\s*(?:加|多加|增加)\s*${AMOUNT}$`, 'u').exec(zh);
151
+ if (m && num(m[2]) && plausibleTarget(m[1].trim()))
152
+ return { kind: 'boost', target: m[1].trim(), tokens: num(m[2]) };
153
+ // ---- the pre-token dollar forms: answer with the token form instead of passing them on
154
+ if (/^(?:set|raise|remove) .*cap.*\$\s*\d/.test(t))
155
+ return { kind: 'usd_hint' };
73
156
  return null;
74
157
  }
75
158
  /**
@@ -89,6 +172,21 @@ export function resolveAgent(who, agents) {
89
172
  const byName = agents.filter((a) => a.name.toLowerCase() === w);
90
173
  return byName.length === 1 ? byName[0].session : null;
91
174
  }
175
+ /**
176
+ * Resolve the team the owner named.
177
+ *
178
+ * @param who - Team name or id (`team CE` works too)
179
+ * @param teams - Teams
180
+ * @returns Team, or null when unknown / ambiguous
181
+ */
182
+ export function resolveTeam(who, teams) {
183
+ const w = who.trim().toLowerCase().replace(/^(?:the )?team\s+/, '').replace(/\s+team$/, '');
184
+ const byId = teams.find((t) => t.id.toLowerCase() === w);
185
+ if (byId)
186
+ return byId;
187
+ const byName = teams.filter((t) => t.name.toLowerCase() === w);
188
+ return byName.length === 1 ? byName[0] : null;
189
+ }
92
190
  /**
93
191
  * The orc's harness line while it is stopped by a cap.
94
192
  *
@@ -96,9 +194,9 @@ export function resolveAgent(who, agents) {
96
194
  * @returns One line
97
195
  */
98
196
  export function orcCappedReply(stop) {
99
- const raise = suggestedRaise(stop.capUsd, stop.spentUsd);
100
- const target = stop.scope === 'total' ? 'total' : 'orc';
101
- return `${spendCapReason(stop, 'Orc')}. No new turns start until midnight; your message is queued. To raise it for today, reply \`raise cap for ${target} to $${raise} today\` (or Settings → System → Spend).`;
197
+ const extra = compactTokens(suggestedBoost(stop.capTokens));
198
+ const who = stop.scope === 'total' ? 'everyone' : stop.scope === 'team' ? (stop.teamName ?? 'the team') : 'orc';
199
+ return `${spendCapReason(stop, 'Orc')}. No new turns start until midnight; your message is queued. To lift it for today, reply \`boost ${who} by ${extra} today\` or \`unlimited today for ${who}\` (or Settings → System → Usage).`;
102
200
  }
103
201
  /**
104
202
  * Run a parsed command.
@@ -109,52 +207,87 @@ export function orcCappedReply(stop) {
109
207
  */
110
208
  export async function runSpendCapCommand(cmd, deps) {
111
209
  const agents = await deps.agents();
112
- const who = (target) => {
210
+ const teams = await deps.teams();
211
+ const agentOf = (target) => {
113
212
  const session = resolveAgent(target, agents);
114
213
  if (!session)
115
- return `I don't know an agent called "${target}". Use its name or session name (e.g. crewly-orc).`;
116
- const name = session === ORCHESTRATOR_SESSION_NAME ? 'Orc' : agents.find((a) => a.session === session)?.name ?? session;
117
- return { session, name };
214
+ return null;
215
+ return { session, name: session === ORCHESTRATOR_SESSION_NAME ? 'Orc' : (agents.find((a) => a.session === session)?.name ?? session) };
216
+ };
217
+ const unknown = (target) => `I don't know a team or agent called "${target}". Use a team name (e.g. ${teams[0]?.name ?? 'CE'}), an agent's name or session name, or "everyone".`;
218
+ const resolve = (target, preferTeam) => {
219
+ if (EVERYONE.has(target.trim().toLowerCase()))
220
+ return { scope: 'all' };
221
+ const team = resolveTeam(target, teams);
222
+ const agent = agentOf(target);
223
+ if (team && (preferTeam || !agent))
224
+ return { scope: 'team', team };
225
+ if (agent)
226
+ return { scope: 'agent', ...agent };
227
+ return unknown(target);
118
228
  };
229
+ const label = (t) => (t.scope === 'all' ? 'everyone' : t.scope === 'team' ? `team ${t.team.name}` : t.name);
230
+ const boostInput = (t) => t.scope === 'all' ? { scope: 'all' } : t.scope === 'team' ? { scope: 'team', id: t.team.id } : { scope: 'agent', id: t.session };
119
231
  switch (cmd.kind) {
232
+ case 'usd_hint':
233
+ return 'Caps are counted in tokens now, not dollars. Try `set daily cap for orc to 5M`, `set team cap for CE to 50M`, or `boost CE by 20M today`.';
120
234
  case 'set_total':
121
- await deps.setCaps({ totalCapUsd: cmd.usd });
122
- return `Daily total spend cap set to ${formatUsd(cmd.usd)} for all agents together.`;
235
+ await deps.setCaps({ totalCapTokens: cmd.tokens });
236
+ return `Daily token cap set to ${formatTokens(cmd.tokens)} for all agents together.`;
123
237
  case 'remove_total':
124
- await deps.setCaps({ totalCapUsd: null });
125
- return 'Daily total spend cap removed.';
238
+ await deps.setCaps({ totalCapTokens: null });
239
+ return 'Daily total token cap removed.';
126
240
  case 'set': {
127
241
  if (!cmd.target) {
128
- await deps.setCaps({ defaultAgentCapUsd: cmd.usd });
129
- return `Daily spend cap set to ${formatUsd(cmd.usd)} per agent (agents with their own cap keep it).`;
242
+ await deps.setCaps({ defaultAgentCapTokens: cmd.tokens });
243
+ return `Daily token cap set to ${formatTokens(cmd.tokens)} per agent (agents with their own cap keep it).`;
130
244
  }
131
- const a = who(cmd.target);
132
- if (typeof a === 'string')
133
- return a;
134
- await deps.setCaps({ agents: { [a.session]: cmd.usd } });
135
- return `Daily spend cap for ${a.name} set to ${formatUsd(cmd.usd)}.`;
245
+ const t = resolve(cmd.target, cmd.team === true);
246
+ if (typeof t === 'string')
247
+ return t;
248
+ if (t.scope === 'all') {
249
+ await deps.setCaps({ totalCapTokens: cmd.tokens });
250
+ return `Daily token cap set to ${formatTokens(cmd.tokens)} for all agents together.`;
251
+ }
252
+ if (t.scope === 'team') {
253
+ await deps.setCaps({ teams: { [t.team.id]: cmd.tokens } });
254
+ return `Daily token cap for team ${t.team.name} set to ${formatTokens(cmd.tokens)} (all its members together).`;
255
+ }
256
+ await deps.setCaps({ agents: { [t.session]: cmd.tokens } });
257
+ return `Daily token cap for ${t.name} set to ${formatTokens(cmd.tokens)}.`;
136
258
  }
137
259
  case 'remove': {
138
260
  if (!cmd.target) {
139
- await deps.setCaps({ defaultAgentCapUsd: null });
140
- return 'Default daily spend cap removed (agents with their own cap keep it).';
261
+ await deps.setCaps({ defaultAgentCapTokens: null });
262
+ return 'Default daily token cap removed (agents with their own cap keep it).';
141
263
  }
142
- const a = who(cmd.target);
143
- if (typeof a === 'string')
144
- return a;
145
- await deps.setCaps({ agents: { [a.session]: null } });
146
- return `${a.name} has no daily spend cap now.`;
147
- }
148
- case 'raise': {
149
- if (cmd.target === C.TOTAL_TARGET) {
150
- const cap = await deps.raiseToday(C.TOTAL_TARGET, cmd.usd);
151
- return `Daily total spend cap raised to ${formatUsd(cap)} for today.`;
264
+ const t = resolve(cmd.target, cmd.team === true);
265
+ if (typeof t === 'string')
266
+ return t;
267
+ if (t.scope === 'all') {
268
+ await deps.setCaps({ totalCapTokens: null });
269
+ return 'Daily total token cap removed.';
152
270
  }
153
- const a = who(cmd.target);
154
- if (typeof a === 'string')
155
- return a;
156
- const cap = await deps.raiseToday(a.session, cmd.usd);
157
- return `${a.name}'s daily spend cap raised to ${formatUsd(cap)} for today. Queued messages are being delivered.`;
271
+ if (t.scope === 'team') {
272
+ await deps.setCaps({ teams: { [t.team.id]: null } });
273
+ return `Team ${t.team.name} has no daily token cap now.`;
274
+ }
275
+ await deps.setCaps({ agents: { [t.session]: null } });
276
+ return `${t.name} has no daily token cap now.`;
277
+ }
278
+ case 'boost': {
279
+ const t = resolve(cmd.target, true);
280
+ if (typeof t === 'string')
281
+ return t;
282
+ await deps.boost({ ...boostInput(t), extraTokens: cmd.tokens, by: 'orc-dm' });
283
+ return `Boosted ${label(t)} by +${formatTokens(cmd.tokens)} until midnight. Queued messages are being delivered.`;
284
+ }
285
+ case 'unlimited': {
286
+ const t = resolve(cmd.target, true);
287
+ if (typeof t === 'string')
288
+ return t;
289
+ await deps.boost({ ...boostInput(t), unlimited: true, by: 'orc-dm' });
290
+ return `No token cap for ${label(t)} until midnight. Queued messages are being delivered.`;
158
291
  }
159
292
  }
160
293
  }
@@ -1 +1 @@
1
- {"version":3,"file":"spend-cap-command.js","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spend-cap-command.js","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap-command.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Spend cap gate — the process-wide hook the delivery and wake paths ask
2
+ * Token cap gate — the process-wide hook the delivery and wake paths ask
3
3
  * "may this agent start a new turn?". Kept apart from the service so the
4
4
  * hot paths (agent registration, the orc queue processor, the owner-message
5
5
  * watchdog) import a tiny module with no dependencies of its own.
@@ -11,12 +11,15 @@
11
11
  /** Why an agent may not start a new turn today. */
12
12
  export interface SpendStop {
13
13
  session: string;
14
- /** `agent`: its own cap; `total`: the all-agents daily total cap */
15
- scope: 'agent' | 'total';
16
- /** The cap in force (USD) */
17
- capUsd: number;
18
- /** What was spent today against it (USD) */
19
- spentUsd: number;
14
+ /** `agent`: its own cap; `team`: its team's cap; `total`: the all-agents cap */
15
+ scope: 'agent' | 'team' | 'total';
16
+ /** The cap in force (tokens, boosts included) */
17
+ capTokens: number;
18
+ /** Tokens used today against it */
19
+ usedTokens: number;
20
+ /** For a team stop: the team */
21
+ teamId?: string;
22
+ teamName?: string;
20
23
  }
21
24
  /** What the service exposes to the gate. */
22
25
  export interface SpendCapGate {
@@ -47,14 +50,7 @@ export declare function spendCapStopOf(session: string): SpendStop | null;
47
50
  */
48
51
  export declare function spendCapNameOf(session: string): string;
49
52
  /**
50
- * USD for owner text.
51
- *
52
- * @param usd - Amount
53
- * @returns e.g. `$5.00`
54
- */
55
- export declare function formatUsd(usd: number): string;
56
- /**
57
- * The one-line reason, e.g. "Orc hit its daily spend cap ($5.00)".
53
+ * The one-line reason, e.g. "Orc hit its daily token cap (5M tokens)".
58
54
  *
59
55
  * @param stop - The stop
60
56
  * @param name - Owner-facing name (default: looked up)
@@ -1 +1 @@
1
- {"version":3,"file":"spend-cap.gate.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap.gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,mDAAmD;AACnD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC1C,qDAAqD;IACrD,aAAa,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CACzC;AAID;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAE/D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAMhE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,GAAE,MAAqC,GAAG,MAAM,CAKnG"}
1
+ {"version":3,"file":"spend-cap.gate.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap.gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,mDAAmD;AACnD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAClC,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC1C,qDAAqD;IACrD,aAAa,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CACzC;AAID;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAE/D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAMhE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,GAAE,MAAqC,GAAG,MAAM,CAQnG"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Spend cap gate — the process-wide hook the delivery and wake paths ask
2
+ * Token cap gate — the process-wide hook the delivery and wake paths ask
3
3
  * "may this agent start a new turn?". Kept apart from the service so the
4
4
  * hot paths (agent registration, the orc queue processor, the owner-message
5
5
  * watchdog) import a tiny module with no dependencies of its own.
@@ -8,6 +8,7 @@
8
8
  *
9
9
  * @module services/spend/spend-cap.gate
10
10
  */
11
+ import { formatTokens } from '../usage/token-format.js';
11
12
  let gate = null;
12
13
  /**
13
14
  * Install (or clear) the gate.
@@ -47,16 +48,7 @@ export function spendCapNameOf(session) {
47
48
  }
48
49
  }
49
50
  /**
50
- * USD for owner text.
51
- *
52
- * @param usd - Amount
53
- * @returns e.g. `$5.00`
54
- */
55
- export function formatUsd(usd) {
56
- return `$${(Math.round(usd * 100) / 100).toFixed(2)}`;
57
- }
58
- /**
59
- * The one-line reason, e.g. "Orc hit its daily spend cap ($5.00)".
51
+ * The one-line reason, e.g. "Orc hit its daily token cap (5M tokens)".
60
52
  *
61
53
  * @param stop - The stop
62
54
  * @param name - Owner-facing name (default: looked up)
@@ -64,8 +56,11 @@ export function formatUsd(usd) {
64
56
  */
65
57
  export function spendCapReason(stop, name = spendCapNameOf(stop.session)) {
66
58
  if (stop.scope === 'total') {
67
- return `${name} is stopped: all agents together hit the daily total spend cap (${formatUsd(stop.capUsd)})`;
59
+ return `${name} is stopped: all agents together hit the daily token cap (${formatTokens(stop.capTokens)})`;
60
+ }
61
+ if (stop.scope === 'team') {
62
+ return `${name} is stopped: team ${stop.teamName ?? stop.teamId ?? ''} hit its daily token cap (${formatTokens(stop.capTokens)})`;
68
63
  }
69
- return `${name} hit its daily spend cap (${formatUsd(stop.capUsd)})`;
64
+ return `${name} hit its daily token cap (${formatTokens(stop.capTokens)})`;
70
65
  }
71
66
  //# sourceMappingURL=spend-cap.gate.js.map