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
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Token usage stats, daily token caps and temporary boosts
3
+ * (Settings → System → Usage).
4
+ *
5
+ * - `GET /api/system/usage?days=7&groupBy=agent|team|project|workItem|runtime|day`
6
+ * — tokens aggregated over the last N local days (groupBy may be a comma list)
7
+ * - `GET /api/system/usage/caps?days=7` — caps, boosts and today's usage per agent / team
8
+ * - `PUT /api/system/usage/caps` — change caps (owner only)
9
+ * `{ defaultAgentCapTokens?, totalCapTokens?, agents?: { "<session>": n|null|"default" }, teams?: { "<teamId>": n|null } }`
10
+ * - `POST /api/system/usage/boost` — temporary boost (owner only)
11
+ * `{ scope: "team"|"agent"|"all", id?, extraTokens? | unlimited: true, until? }`
12
+ * - `DELETE /api/system/usage/boost/:id` — end a boost early (owner only)
13
+ *
14
+ * Kept for older clients: `GET /api/system/spend` (= usage/caps),
15
+ * `GET|PUT /api/system/spend/caps`. `POST /api/system/spend/raise` answers
16
+ * 410 — raises are boosts now.
17
+ *
18
+ * Owner only: a request from an agent session gets 403 — an agent never
19
+ * raises its own budget.
20
+ *
21
+ * specs/2026-10-02-spend-cap.md
22
+ *
23
+ * @module controllers/system/usage.controller
24
+ */
25
+ import { ensureOwnerCaller } from './system-control.controller.js';
26
+ import { getSpendCapService, SpendCapError } from '../../services/spend/spend-cap.service.js';
27
+ import { SPEND_CAP_CONSTANTS } from '../../constants.js';
28
+ import { parseGroupBy, UsageStatsService } from '../../services/usage/usage-stats.service.js';
29
+ import { TokenUsageService } from '../../services/monitoring/token-usage.service.js';
30
+ import { StorageService } from '../../services/core/storage.service.js';
31
+ import { TaskPoolService } from '../../services/task-pool/task-pool.service.js';
32
+ const NOT_READY = 'Usage tracking is not ready yet — Crewly is still starting.';
33
+ let defaultStats = null;
34
+ /**
35
+ * The backend's stats service, built from the process singletons.
36
+ *
37
+ * @returns Service
38
+ */
39
+ export function getUsageStatsService() {
40
+ if (!defaultStats) {
41
+ defaultStats = new UsageStatsService({
42
+ ledger: TokenUsageService.getInstance(),
43
+ teams: async () => (await StorageService.getInstance().getTeams()).map((t) => ({
44
+ id: t.id,
45
+ name: t.name,
46
+ projectIds: t.projectIds ?? [],
47
+ members: (t.members ?? []).map((m) => ({ session: m.sessionName, name: m.name })),
48
+ })),
49
+ projects: async () => (await StorageService.getInstance().getProjects()).map((p) => ({ id: p.id, name: p.name })),
50
+ workItems: async () => TaskPoolService.getInstance().getAllItems(),
51
+ });
52
+ }
53
+ return defaultStats;
54
+ }
55
+ /**
56
+ * Send an error.
57
+ *
58
+ * @param res - Response
59
+ * @param err - Error
60
+ */
61
+ function fail(res, err) {
62
+ const status = err instanceof SpendCapError ? err.status : 500;
63
+ res.status(status).json({ success: false, error: err instanceof Error ? err.message : String(err) });
64
+ }
65
+ /**
66
+ * Days query value.
67
+ *
68
+ * @param req - Request
69
+ * @returns Days
70
+ */
71
+ function daysOf(req) {
72
+ const raw = Number(req.query.days ?? SPEND_CAP_CONSTANTS.DEFAULT_DAYS);
73
+ return Number.isFinite(raw) ? raw : SPEND_CAP_CONSTANTS.DEFAULT_DAYS;
74
+ }
75
+ /**
76
+ * Register the routes.
77
+ *
78
+ * @param router - The /api router
79
+ * @param deps - Dependencies (default: the backend's)
80
+ */
81
+ export function registerUsageRoutes(router, deps = { caps: getSpendCapService, stats: getUsageStatsService }) {
82
+ router.get('/system/usage', async (req, res) => {
83
+ const stats = deps.stats();
84
+ if (!stats) {
85
+ res.status(503).json({ success: false, error: NOT_READY });
86
+ return;
87
+ }
88
+ try {
89
+ res.json({ success: true, data: await stats.query(daysOf(req), parseGroupBy(req.query.groupBy)) });
90
+ }
91
+ catch (err) {
92
+ fail(res, err);
93
+ }
94
+ });
95
+ const capsView = async (req, res) => {
96
+ const caps = deps.caps();
97
+ if (!caps) {
98
+ res.status(503).json({ success: false, error: NOT_READY });
99
+ return;
100
+ }
101
+ try {
102
+ res.json({ success: true, data: await caps.view(daysOf(req)) });
103
+ }
104
+ catch (err) {
105
+ fail(res, err);
106
+ }
107
+ };
108
+ router.get('/system/usage/caps', capsView);
109
+ router.get('/system/spend', capsView);
110
+ router.get('/system/spend/caps', (_req, res) => {
111
+ const caps = deps.caps();
112
+ if (!caps) {
113
+ res.status(503).json({ success: false, error: NOT_READY });
114
+ return;
115
+ }
116
+ res.json({ success: true, data: caps.getConfig() });
117
+ });
118
+ const setCaps = async (req, res) => {
119
+ if (!ensureOwnerCaller(req, res, 'token cap change'))
120
+ return;
121
+ const caps = deps.caps();
122
+ if (!caps) {
123
+ res.status(503).json({ success: false, error: NOT_READY });
124
+ return;
125
+ }
126
+ try {
127
+ res.json({ success: true, data: await caps.setCaps(req.body ?? {}) });
128
+ }
129
+ catch (err) {
130
+ fail(res, err);
131
+ }
132
+ };
133
+ router.put('/system/usage/caps', setCaps);
134
+ router.put('/system/spend/caps', setCaps);
135
+ router.post('/system/usage/boost', async (req, res) => {
136
+ if (!ensureOwnerCaller(req, res, 'usage boost'))
137
+ return;
138
+ const caps = deps.caps();
139
+ if (!caps) {
140
+ res.status(503).json({ success: false, error: NOT_READY });
141
+ return;
142
+ }
143
+ const b = (req.body ?? {});
144
+ try {
145
+ const boost = await caps.boost({
146
+ scope: b.scope,
147
+ id: typeof b.id === 'string' ? b.id : undefined,
148
+ extraTokens: b.extraTokens,
149
+ unlimited: b.unlimited === true,
150
+ until: typeof b.until === 'string' ? b.until : undefined,
151
+ by: 'owner',
152
+ });
153
+ res.json({ success: true, data: boost });
154
+ }
155
+ catch (err) {
156
+ fail(res, err);
157
+ }
158
+ });
159
+ router.delete('/system/usage/boost/:id', async (req, res) => {
160
+ if (!ensureOwnerCaller(req, res, 'usage boost removal'))
161
+ return;
162
+ const caps = deps.caps();
163
+ if (!caps) {
164
+ res.status(503).json({ success: false, error: NOT_READY });
165
+ return;
166
+ }
167
+ try {
168
+ const removed = await caps.removeBoost(req.params.id);
169
+ res.status(removed ? 200 : 404).json(removed ? { success: true, data: { id: req.params.id } } : { success: false, error: 'No such boost' });
170
+ }
171
+ catch (err) {
172
+ fail(res, err);
173
+ }
174
+ });
175
+ router.post('/system/spend/raise', (req, res) => {
176
+ if (!ensureOwnerCaller(req, res, 'spend cap raise'))
177
+ return;
178
+ res.status(410).json({ success: false, error: 'Caps are in tokens now; raise one for today with POST /api/system/usage/boost { scope, id, extraTokens | unlimited }' });
179
+ });
180
+ }
181
+ //# sourceMappingURL=usage.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/system/usage.controller.ts"],"names":[],"mappings":"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"}
@@ -246,6 +246,13 @@ export declare class CrewlyServer {
246
246
  /**
247
247
  * Start decision cards: the service, its Slack listeners and its deadline tick.
248
248
  */
249
+ /**
250
+ * Record Codex (rollout files) and Antigravity (conversation databases)
251
+ * usage in the shared token ledger, attributed to Crewly sessions.
252
+ *
253
+ * @param tokenUsage - The ledger
254
+ */
255
+ private startRuntimeUsageSyncs;
249
256
  private startDecisionCards;
250
257
  private startOwnerMessageWatchdog;
251
258
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../backend/src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../backend/src/index.ts"],"names":[],"mappings":"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"}
@@ -64,7 +64,7 @@ import { getSlackAutoWorkingService } from './services/slack/slack-auto-working.
64
64
  import { getSlackAgentDmService } from './services/slack/slack-agent-dm.service.js';
65
65
  import { sendBootAnnouncement, isFirstBoot, markBooted } from './services/boot/boot-announce.service.js';
66
66
  import { SubAgentMessageQueue } from './services/messaging/sub-agent-message-queue.service.js';
67
- import { SUB_AGENT_QUEUE_CONSTANTS, CHAT_CONTEXT_CONSTANTS, SAFE_RESTART, AUTO_UPDATE_CONSTANTS, PROCESS_EXIT_CODES, CLAUDE_STARTUP_CONSTANTS, WEB_CONSTANTS, TICKET_CONSTANTS, UNASSIGNED_ROUTE_CONSTANTS, CLOUD_TALK_CONSTANTS, STANDING_ANSWERS_CONSTANTS, TICKET_AUTOPILOT_CONSTANTS, WORK_ITEM_DESTINATION_CONSTANTS } from './constants.js';
67
+ import { SUB_AGENT_QUEUE_CONSTANTS, CHAT_CONTEXT_CONSTANTS, SAFE_RESTART, AUTO_UPDATE_CONSTANTS, PROCESS_EXIT_CODES, CLAUDE_STARTUP_CONSTANTS, WEB_CONSTANTS, TICKET_CONSTANTS, UNASSIGNED_ROUTE_CONSTANTS, CLOUD_TALK_CONSTANTS, STANDING_ANSWERS_CONSTANTS, TICKET_AUTOPILOT_CONSTANTS, WORK_ITEM_DESTINATION_CONSTANTS, CODEX_USAGE_SYNC_CONSTANTS, ANTIGRAVITY_USAGE_SYNC_CONSTANTS } from './constants.js';
68
68
  import { PtyActivityTrackerService } from './services/agent/pty-activity-tracker.service.js';
69
69
  import { InFlightTurnTracker } from './services/restart/in-flight-turn-tracker.service.js';
70
70
  import { TicketIntakeService, setTicketIntakeService, resolveTicketIdForSession, } from './services/v3/ticket-intake.service.js';
@@ -1977,7 +1977,7 @@ export class CrewlyServer {
1977
1977
  error: error instanceof Error ? error.message : String(error),
1978
1978
  });
1979
1979
  }
1980
- // Per-agent daily spend cap with a hard stop (specs/2026-10-02-spend-cap.md).
1980
+ // Daily token caps (agent / team / total) + boosts, hard stop (specs/2026-10-02-spend-cap.md).
1981
1981
  // Caps are off until the owner sets one.
1982
1982
  try {
1983
1983
  const { startSpendCaps } = await import('./services/spend/spend-cap.wiring.js');
@@ -1992,10 +1992,10 @@ export class CrewlyServer {
1992
1992
  },
1993
1993
  logger: LoggerService.getInstance().createComponentLogger('SpendCap'),
1994
1994
  });
1995
- this.logger.info('Spend caps wired');
1995
+ this.logger.info('Token caps wired');
1996
1996
  }
1997
1997
  catch (error) {
1998
- this.logger.warn('Failed to wire spend caps (non-critical)', {
1998
+ this.logger.warn('Failed to wire token caps (non-critical)', {
1999
1999
  error: error instanceof Error ? error.message : String(error),
2000
2000
  });
2001
2001
  }
@@ -2987,6 +2987,9 @@ export class CrewlyServer {
2987
2987
  });
2988
2988
  TicketAutopilotService.getInstance()?.stop();
2989
2989
  TicketAutopilotService.setInstance(autopilot);
2990
+ // Budgets are tokens now (specs/2026-10-02-spend-cap.md): convert
2991
+ // any pre-token USD budget once, logged per project.
2992
+ await autopilot.migrateUsdBudgets().catch((err) => this.logger.warn('Ticket autopilot USD→token budget migration failed (non-fatal)', { error: err instanceof Error ? err.message : String(err) }));
2990
2993
  autopilot.start();
2991
2994
  this.logger.info('Ticket autopilot started (acts only on projects that switched it on)');
2992
2995
  }
@@ -3118,6 +3121,9 @@ export class CrewlyServer {
3118
3121
  }
3119
3122
  });
3120
3123
  await transcriptSync.start();
3124
+ // Codex and Antigravity usage into the same ledger
3125
+ // (specs/2026-10-02-spend-cap.md §Sources).
3126
+ await this.startRuntimeUsageSyncs(tokenUsageService);
3121
3127
  this.logger.info('Token usage tracking initialized');
3122
3128
  }
3123
3129
  catch (tokenErr) {
@@ -4701,6 +4707,55 @@ export class CrewlyServer {
4701
4707
  /**
4702
4708
  * Start decision cards: the service, its Slack listeners and its deadline tick.
4703
4709
  */
4710
+ /**
4711
+ * Record Codex (rollout files) and Antigravity (conversation databases)
4712
+ * usage in the shared token ledger, attributed to Crewly sessions.
4713
+ *
4714
+ * @param tokenUsage - The ledger
4715
+ */
4716
+ async startRuntimeUsageSyncs(tokenUsage) {
4717
+ const crewlyHome = this.config.crewlyHome;
4718
+ const sessions = () => getSessionStatePersistence().getRegisteredSessionsMap();
4719
+ try {
4720
+ const { CodexRolloutSyncService } = await import('./services/monitoring/codex-rollout-sync.service.js');
4721
+ const { defaultCodexHome } = await import('./services/agent/runtime-session-recovery.js');
4722
+ const codex = new CodexRolloutSyncService({
4723
+ codexHome: defaultCodexHome(),
4724
+ cursorFile: path.join(crewlyHome, CODEX_USAGE_SYNC_CONSTANTS.CURSOR_FILE),
4725
+ sessions,
4726
+ record: (session, e) => tokenUsage.recordUsage(session, session, e.input, e.output, e.model, undefined, {
4727
+ cachedInput: e.cachedInput,
4728
+ timestamp: e.timestamp,
4729
+ runtime: RUNTIME_TYPES.CODEX_CLI,
4730
+ }),
4731
+ logger: LoggerService.getInstance().createComponentLogger('CodexUsageSync'),
4732
+ });
4733
+ await codex.start();
4734
+ }
4735
+ catch (err) {
4736
+ this.logger.warn('Codex usage sync not started (non-fatal)', { error: err instanceof Error ? err.message : String(err) });
4737
+ }
4738
+ try {
4739
+ const { AntigravityUsageSyncService, sqliteStepReader } = await import('./services/monitoring/antigravity-usage-sync.service.js');
4740
+ const { getAntigravityConfigDir } = await import('./utils/antigravity-settings.utils.js');
4741
+ const { createBareModuleRequire } = await import('./utils/node-require.utils.js');
4742
+ const agy = new AntigravityUsageSyncService({
4743
+ configDir: getAntigravityConfigDir(),
4744
+ cursorFile: path.join(crewlyHome, ANTIGRAVITY_USAGE_SYNC_CONSTANTS.CURSOR_FILE),
4745
+ sessions,
4746
+ readSteps: sqliteStepReader(createBareModuleRequire(typeof require === 'function' ? require : null)),
4747
+ record: (session, e) => tokenUsage.recordUsage(session, session, e.input, e.output, e.model, undefined, {
4748
+ timestamp: e.timestamp,
4749
+ runtime: RUNTIME_TYPES.ANTIGRAVITY_CLI,
4750
+ }),
4751
+ logger: LoggerService.getInstance().createComponentLogger('AntigravityUsageSync'),
4752
+ });
4753
+ await agy.start();
4754
+ }
4755
+ catch (err) {
4756
+ this.logger.warn('Antigravity usage sync not started (non-fatal)', { error: err instanceof Error ? err.message : String(err) });
4757
+ }
4758
+ }
4704
4759
  async startDecisionCards() {
4705
4760
  try {
4706
4761
  const { createDecisionService, attachDecisionSlackListeners, attachSkipAllCommand } = await import('./services/decisions/decision.wiring.js');