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.
- package/config/skills/agent/core/project-tickets/SKILL.md +3 -2
- package/config/skills/agent/core/project-tickets/execute.sh +4 -4
- package/config/skills/agent/core/project-tickets/execute.test.sh +2 -2
- package/dist/backend/backend/src/constants.d.ts +70 -12
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +70 -12
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +5 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js +1 -1
- package/dist/backend/backend/src/controllers/system/usage.controller.d.ts +46 -0
- package/dist/backend/backend/src/controllers/system/usage.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/system/usage.controller.js +181 -0
- package/dist/backend/backend/src/controllers/system/usage.controller.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts +7 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +59 -4
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/modules/system.routes.js +3 -3
- package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +7 -7
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts +4 -2
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js +6 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +2 -2
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +4 -2
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.d.ts +130 -0
- package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.js +274 -0
- package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.d.ts +152 -0
- package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.js +311 -0
- package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +53 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js +51 -3
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts +4 -4
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts +4 -3
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js +7 -4
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts +40 -9
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +68 -20
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap-command.d.ts +48 -18
- package/dist/backend/backend/src/services/spend/spend-cap-command.d.ts.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap-command.js +195 -62
- package/dist/backend/backend/src/services/spend/spend-cap-command.js.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.gate.d.ts +11 -15
- package/dist/backend/backend/src/services/spend/spend-cap.gate.d.ts.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.gate.js +8 -13
- package/dist/backend/backend/src/services/spend/spend-cap.gate.js.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts +179 -64
- package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.service.js +406 -149
- package/dist/backend/backend/src/services/spend/spend-cap.service.js.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.store.d.ts +52 -11
- package/dist/backend/backend/src/services/spend/spend-cap.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.store.js +67 -21
- package/dist/backend/backend/src/services/spend/spend-cap.store.js.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.wiring.d.ts +3 -1
- package/dist/backend/backend/src/services/spend/spend-cap.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-cap.wiring.js +21 -7
- package/dist/backend/backend/src/services/spend/spend-cap.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-ledger.service.d.ts +57 -36
- package/dist/backend/backend/src/services/spend/spend-ledger.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/spend/spend-ledger.service.js +80 -55
- package/dist/backend/backend/src/services/spend/spend-ledger.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/work-item-usage.d.ts +10 -1
- package/dist/backend/backend/src/services/task-pool/work-item-usage.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/work-item-usage.js +2 -0
- package/dist/backend/backend/src/services/task-pool/work-item-usage.js.map +1 -1
- package/dist/backend/backend/src/services/usage/token-format.d.ts +49 -0
- package/dist/backend/backend/src/services/usage/token-format.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage/token-format.js +81 -0
- package/dist/backend/backend/src/services/usage/token-format.js.map +1 -0
- package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts +132 -0
- package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage/usage-stats.service.js +226 -0
- package/dist/backend/backend/src/services/usage/usage-stats.service.js.map +1 -0
- package/dist/backend/backend/src/types/decision.types.d.ts +2 -2
- package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts +24 -7
- package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/ticket-autopilot.types.js +29 -13
- package/dist/backend/backend/src/types/ticket-autopilot.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +70 -12
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +70 -12
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +7 -7
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts +4 -2
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js +6 -1
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js +2 -2
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +4 -2
- package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +53 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js +51 -3
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/cli/backend/src/services/spend/spend-cap.gate.d.ts +11 -15
- package/dist/cli/backend/src/services/spend/spend-cap.gate.d.ts.map +1 -1
- package/dist/cli/backend/src/services/spend/spend-cap.gate.js +8 -13
- package/dist/cli/backend/src/services/spend/spend-cap.gate.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/work-item-usage.d.ts +10 -1
- package/dist/cli/backend/src/services/task-pool/work-item-usage.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/work-item-usage.js +2 -0
- package/dist/cli/backend/src/services/task-pool/work-item-usage.js.map +1 -1
- package/dist/cli/backend/src/services/usage/token-format.d.ts +49 -0
- package/dist/cli/backend/src/services/usage/token-format.d.ts.map +1 -0
- package/dist/cli/backend/src/services/usage/token-format.js +81 -0
- package/dist/cli/backend/src/services/usage/token-format.js.map +1 -0
- package/dist/cli/backend/src/types/decision.types.d.ts +2 -2
- package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts +24 -7
- package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/ticket-autopilot.types.js +29 -13
- package/dist/cli/backend/src/types/ticket-autopilot.types.js.map +1 -1
- package/frontend/dist/assets/{index-15c2faf2.js → index-49f50b45.js} +276 -276
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
- package/dist/backend/backend/src/controllers/system/spend.controller.d.ts +0 -32
- package/dist/backend/backend/src/controllers/system/spend.controller.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/system/spend.controller.js +0 -100
- package/dist/backend/backend/src/controllers/system/spend.controller.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spend-cap.gate.js","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap.gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"spend-cap.gate.js","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap.gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAwBxD,IAAI,IAAI,GAAwB,IAAI,CAAC;AAErC;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAyB;IACvD,IAAI,GAAG,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,aAAa,EAAE,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAe,EAAE,OAAe,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;IACzF,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,GAAG,IAAI,6DAA6D,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;IAC7G,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,GAAG,IAAI,qBAAqB,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,6BAA6B,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;IACpI,CAAC;IACD,OAAO,GAAG,IAAI,6BAA6B,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AAC7E,CAAC"}
|
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Daily token caps with a hard stop: per agent, per team and all agents
|
|
3
|
+
* together, plus temporary boosts.
|
|
3
4
|
*
|
|
5
|
+
* - The unit is tokens (input incl. cached + output, see `eventTokens`).
|
|
4
6
|
* - Caps are the owner's own limits (unlike the runtime fallback, which
|
|
5
7
|
* reacts to a provider's usage limit). All are OFF until the owner sets
|
|
6
|
-
* one: a default per-agent cap, per-agent overrides, and an
|
|
7
|
-
* all-agents
|
|
8
|
+
* one: a default per-agent cap, per-agent overrides, per-team caps, and an
|
|
9
|
+
* optional all-agents total.
|
|
8
10
|
* - At {@link SPEND_CAP_CONSTANTS.WARN_FRACTION} of a cap the owner gets ONE
|
|
9
11
|
* heads-up.
|
|
10
12
|
* - At 100% the agent is hard-stopped: {@link stopOf} answers the delivery
|
|
11
13
|
* and wake gates, so no new turn starts (the current one may finish) and
|
|
12
|
-
* messages stay queued. The owner gets ONE decision card: "
|
|
13
|
-
* today" / "Keep stopped".
|
|
14
|
-
* -
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
14
|
+
* messages stay queued. The owner gets ONE decision card: "Boost +X
|
|
15
|
+
* today" / "Unlimited today" / "Keep stopped".
|
|
16
|
+
* - A boost covers an agent, a team (its members) or everyone. For every
|
|
17
|
+
* agent it covers, it adds `extraTokens` to EVERY cap checked for that
|
|
18
|
+
* agent (its own, its team's, the total), or lifts them all
|
|
19
|
+
* (`unlimited`). It ends at `until` — by default the next local midnight.
|
|
20
|
+
* - Local midnight resets the day; when a stop lifts (midnight, boost, cap
|
|
21
|
+
* change) the queued messages are released.
|
|
20
22
|
*
|
|
21
23
|
* specs/2026-10-02-spend-cap.md
|
|
22
24
|
*
|
|
@@ -25,8 +27,8 @@
|
|
|
25
27
|
import type { OwnerDecision } from '../../types/decision.types.js';
|
|
26
28
|
import type { SystemAskInput } from '../decisions/decision.service.js';
|
|
27
29
|
import { type SpendCapGate, type SpendStop } from './spend-cap.gate.js';
|
|
28
|
-
import {
|
|
29
|
-
import { type SpendCapConfig, type SpendCapStoreLike } from './spend-cap.store.js';
|
|
30
|
+
import type { SpendLedger, SpendSummary } from './spend-ledger.service.js';
|
|
31
|
+
import { type SpendCapConfig, type SpendCapStoreLike, type UsageBoost } from './spend-cap.store.js';
|
|
30
32
|
/** Minimal logger. */
|
|
31
33
|
export interface SpendCapLogger {
|
|
32
34
|
info(message: string, meta?: Record<string, unknown>): void;
|
|
@@ -37,10 +39,17 @@ export interface SpendCapDecisions {
|
|
|
37
39
|
askSystem(input: SystemAskInput): Promise<OwnerDecision>;
|
|
38
40
|
replyInThread(id: string, text: string): Promise<boolean>;
|
|
39
41
|
}
|
|
42
|
+
/** A team, as caps need it. */
|
|
43
|
+
export interface CapTeam {
|
|
44
|
+
id: string;
|
|
45
|
+
name: string;
|
|
46
|
+
/** Member sessions */
|
|
47
|
+
members: string[];
|
|
48
|
+
}
|
|
40
49
|
/** Collaborators. */
|
|
41
50
|
export interface SpendCapServiceDeps {
|
|
42
51
|
store: SpendCapStoreLike;
|
|
43
|
-
ledger: Pick<SpendLedger, '
|
|
52
|
+
ledger: Pick<SpendLedger, 'usedToday' | 'groupToday' | 'totalToday' | 'summarize' | 'invalidate'>;
|
|
44
53
|
/** One line to the owner (Slack DM from this machine's orc bot); false/throw = not sent */
|
|
45
54
|
notifyOwner: (text: string) => Promise<unknown>;
|
|
46
55
|
/** Decision cards (null before they are wired: the stop is then a plain notice) */
|
|
@@ -49,21 +58,38 @@ export interface SpendCapServiceDeps {
|
|
|
49
58
|
displayNameOf?: (session: string) => string;
|
|
50
59
|
/** Sessions the owner configured (orc + team members), for the caps view */
|
|
51
60
|
knownSessions?: () => Promise<string[]>;
|
|
61
|
+
/** Teams and their member sessions */
|
|
62
|
+
teams?: () => Promise<CapTeam[]>;
|
|
52
63
|
/** Stops lifted: deliver what was queued for these sessions */
|
|
53
64
|
onReleased?: (sessions: string[]) => Promise<void>;
|
|
54
65
|
now?: () => Date;
|
|
55
66
|
logger?: SpendCapLogger;
|
|
56
67
|
}
|
|
57
|
-
/** Body of `PUT /api/system/
|
|
68
|
+
/** Body of `PUT /api/system/usage/caps`. Amounts are tokens (a number, or text like "20M"). */
|
|
58
69
|
export interface SpendCapPatch {
|
|
59
|
-
/** Default per-agent cap
|
|
60
|
-
|
|
61
|
-
/** All-agents total cap
|
|
62
|
-
|
|
63
|
-
/** Session → cap
|
|
64
|
-
agents?: Record<string,
|
|
70
|
+
/** Default per-agent cap; null turns it off */
|
|
71
|
+
defaultAgentCapTokens?: unknown;
|
|
72
|
+
/** All-agents total cap; null turns it off */
|
|
73
|
+
totalCapTokens?: unknown;
|
|
74
|
+
/** Session → cap, `null` = no cap for this agent, `"default"` = drop the override */
|
|
75
|
+
agents?: Record<string, unknown>;
|
|
76
|
+
/** Team id → cap, `null` = drop the team's cap */
|
|
77
|
+
teams?: Record<string, unknown>;
|
|
78
|
+
}
|
|
79
|
+
/** Body of `POST /api/system/usage/boost`. */
|
|
80
|
+
export interface BoostInput {
|
|
81
|
+
scope: 'team' | 'agent' | 'all';
|
|
82
|
+
/** Team id / name, or agent session / name (not for `all`) */
|
|
83
|
+
id?: string;
|
|
84
|
+
/** Extra tokens today (number or "20M") */
|
|
85
|
+
extraTokens?: unknown;
|
|
86
|
+
/** No cap at all */
|
|
87
|
+
unlimited?: boolean;
|
|
88
|
+
/** ISO end time; default the next local midnight */
|
|
89
|
+
until?: string;
|
|
90
|
+
by?: string;
|
|
65
91
|
}
|
|
66
|
-
/** A rejected
|
|
92
|
+
/** A rejected change. */
|
|
67
93
|
export declare class SpendCapError extends Error {
|
|
68
94
|
readonly status: number;
|
|
69
95
|
/**
|
|
@@ -72,53 +98,83 @@ export declare class SpendCapError extends Error {
|
|
|
72
98
|
*/
|
|
73
99
|
constructor(status: number, message: string);
|
|
74
100
|
}
|
|
75
|
-
/**
|
|
101
|
+
/** Where an agent's own cap comes from. */
|
|
102
|
+
export type CapSource = 'override' | 'default' | 'none' | 'exempt';
|
|
103
|
+
/** One agent in the caps view. */
|
|
76
104
|
export interface SpendCapAgentView {
|
|
77
105
|
session: string;
|
|
78
106
|
name: string;
|
|
107
|
+
teamId?: string;
|
|
79
108
|
runtimes: string[];
|
|
80
|
-
|
|
81
|
-
|
|
109
|
+
todayTokens: number;
|
|
110
|
+
windowTokens: number;
|
|
82
111
|
daily: number[];
|
|
83
|
-
/**
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
|
|
87
|
-
|
|
112
|
+
/** Own cap in force today (boosts included), null = none */
|
|
113
|
+
capTokens: number | null;
|
|
114
|
+
/** Own cap before boosts */
|
|
115
|
+
baseCapTokens: number | null;
|
|
116
|
+
capSource: CapSource;
|
|
117
|
+
/** Boosts covering it */
|
|
118
|
+
boosted: boolean;
|
|
119
|
+
unlimited: boolean;
|
|
88
120
|
stopped: boolean;
|
|
89
121
|
stopReason?: string;
|
|
90
122
|
}
|
|
91
|
-
/**
|
|
123
|
+
/** One team in the caps view. */
|
|
124
|
+
export interface SpendCapTeamView {
|
|
125
|
+
teamId: string;
|
|
126
|
+
name: string;
|
|
127
|
+
members: string[];
|
|
128
|
+
todayTokens: number;
|
|
129
|
+
baseCapTokens: number | null;
|
|
130
|
+
/** Cap in force today (team / everyone boosts included), null = none */
|
|
131
|
+
capTokens: number | null;
|
|
132
|
+
extraTokens: number;
|
|
133
|
+
unlimited: boolean;
|
|
134
|
+
/** Boosts on this team (not counting everyone-boosts) */
|
|
135
|
+
boosts: UsageBoost[];
|
|
136
|
+
stopped: boolean;
|
|
137
|
+
}
|
|
138
|
+
/** What `GET /api/system/usage/caps` returns. */
|
|
92
139
|
export interface SpendView extends Omit<SpendSummary, 'agents'> {
|
|
93
140
|
agents: SpendCapAgentView[];
|
|
141
|
+
teams: SpendCapTeamView[];
|
|
94
142
|
caps: SpendCapConfig;
|
|
95
|
-
/**
|
|
96
|
-
|
|
97
|
-
/** Total cap in force today (
|
|
98
|
-
|
|
99
|
-
/** Suggested default per-agent cap:
|
|
100
|
-
|
|
143
|
+
/** Boosts in force */
|
|
144
|
+
boosts: UsageBoost[];
|
|
145
|
+
/** Total cap in force today (everyone boosts included), null = off */
|
|
146
|
+
totalCapTodayTokens: number | null;
|
|
147
|
+
/** Suggested default per-agent cap: the window's p90 agent-day, rounded up to a whole million (null = no data) */
|
|
148
|
+
suggestedAgentCapTokens: number | null;
|
|
101
149
|
/** All agents together stopped by the total cap */
|
|
102
150
|
totalStopped: boolean;
|
|
103
151
|
}
|
|
104
152
|
/**
|
|
105
|
-
*
|
|
106
|
-
* whole dollars, and always above what was already spent.
|
|
153
|
+
* Round up to a whole million (at least 1M).
|
|
107
154
|
*
|
|
108
|
-
* @param
|
|
109
|
-
* @
|
|
110
|
-
* @returns USD
|
|
155
|
+
* @param tokens - Tokens
|
|
156
|
+
* @returns Rounded tokens
|
|
111
157
|
*/
|
|
112
|
-
export declare function
|
|
158
|
+
export declare function roundUpMillions(tokens: number): number;
|
|
113
159
|
/**
|
|
114
|
-
*
|
|
160
|
+
* The "Boost +X today" amount on a cap card: the cap times BOOST_FACTOR,
|
|
161
|
+
* rounded up to a whole million.
|
|
162
|
+
*
|
|
163
|
+
* @param capTokens - Cap in force
|
|
164
|
+
* @returns Tokens
|
|
165
|
+
*/
|
|
166
|
+
export declare function suggestedBoost(capTokens: number): number;
|
|
167
|
+
/**
|
|
168
|
+
* Read the amount out of a "Boost +X tokens today" option label.
|
|
115
169
|
*
|
|
116
170
|
* @param label - Option label
|
|
117
|
-
* @returns
|
|
171
|
+
* @returns Tokens, `unlimited`, or null when the label is not a boost
|
|
118
172
|
*/
|
|
119
|
-
export declare function
|
|
173
|
+
export declare function boostOfLabel(label: string | undefined): number | 'unlimited' | null;
|
|
174
|
+
/** Team target key. */
|
|
175
|
+
export declare function teamTarget(teamId: string): string;
|
|
120
176
|
/**
|
|
121
|
-
*
|
|
177
|
+
* Daily token cap service.
|
|
122
178
|
*/
|
|
123
179
|
export declare class SpendCapService implements SpendCapGate {
|
|
124
180
|
private readonly deps;
|
|
@@ -128,9 +184,11 @@ export declare class SpendCapService implements SpendCapGate {
|
|
|
128
184
|
private timer;
|
|
129
185
|
/** Sessions stopped at the last evaluation (to release them when the stop lifts) */
|
|
130
186
|
private lastStopped;
|
|
131
|
-
/** Evaluation passes run one after another */
|
|
132
187
|
private chain;
|
|
133
188
|
private queuedPass;
|
|
189
|
+
/** Team index, refreshed on every evaluation (the gate is synchronous) */
|
|
190
|
+
private teamList;
|
|
191
|
+
private teamsOfSession;
|
|
134
192
|
/**
|
|
135
193
|
* @param deps - Collaborators
|
|
136
194
|
*/
|
|
@@ -139,6 +197,8 @@ export declare class SpendCapService implements SpendCapGate {
|
|
|
139
197
|
start(): void;
|
|
140
198
|
/** Stop the tick. */
|
|
141
199
|
stop(): void;
|
|
200
|
+
/** Re-read the team list now (tests; the tick does it too). */
|
|
201
|
+
refreshTeams(): Promise<void>;
|
|
142
202
|
/** @returns The owner's caps (a copy) */
|
|
143
203
|
getConfig(): SpendCapConfig;
|
|
144
204
|
/**
|
|
@@ -149,18 +209,64 @@ export declare class SpendCapService implements SpendCapGate {
|
|
|
149
209
|
* @throws SpendCapError on a bad value
|
|
150
210
|
*/
|
|
151
211
|
setCaps(patch: SpendCapPatch): Promise<SpendCapConfig>;
|
|
212
|
+
/** @returns Boosts in force (expired ones are dropped) */
|
|
213
|
+
activeBoosts(): UsageBoost[];
|
|
214
|
+
/**
|
|
215
|
+
* Add a temporary boost.
|
|
216
|
+
*
|
|
217
|
+
* @param input - Scope, target, extra tokens or unlimited, optional end
|
|
218
|
+
* @returns The boost
|
|
219
|
+
* @throws SpendCapError on a bad request
|
|
220
|
+
*/
|
|
221
|
+
boost(input: BoostInput): Promise<UsageBoost>;
|
|
222
|
+
/**
|
|
223
|
+
* End a boost early.
|
|
224
|
+
*
|
|
225
|
+
* @param id - Boost id
|
|
226
|
+
* @returns True when it existed
|
|
227
|
+
*/
|
|
228
|
+
removeBoost(id: string): Promise<boolean>;
|
|
229
|
+
/**
|
|
230
|
+
* Owner-facing description of a boost target.
|
|
231
|
+
*
|
|
232
|
+
* @param target - Boost target
|
|
233
|
+
* @returns e.g. `everyone`, `team CE`, `Ella`
|
|
234
|
+
*/
|
|
235
|
+
describeTarget(target: string): string;
|
|
152
236
|
/**
|
|
153
|
-
*
|
|
237
|
+
* Extra tokens / unlimited a boost set gives for one target set.
|
|
154
238
|
*
|
|
155
|
-
* @param
|
|
156
|
-
* @
|
|
157
|
-
* @returns The new cap for today
|
|
158
|
-
* @throws SpendCapError when the amount is not above today's spend
|
|
239
|
+
* @param covers - Which boost targets apply
|
|
240
|
+
* @returns Sum of extras and whether any is unlimited
|
|
159
241
|
*/
|
|
160
|
-
|
|
242
|
+
private boostFor;
|
|
243
|
+
/** Boosts covering an agent: its own, its teams', everyone's. */
|
|
244
|
+
private boostForSession;
|
|
245
|
+
/**
|
|
246
|
+
* Boosts covering a team (team and everyone boosts) — what the ticket
|
|
247
|
+
* autopilot budget of the team's projects honours.
|
|
248
|
+
*
|
|
249
|
+
* @param teamId - Team id
|
|
250
|
+
* @returns Extra tokens and unlimited
|
|
251
|
+
*/
|
|
252
|
+
boostForTeam(teamId: string): {
|
|
253
|
+
extra: number;
|
|
254
|
+
unlimited: boolean;
|
|
255
|
+
};
|
|
256
|
+
/**
|
|
257
|
+
* Boosts covering any of several teams, each boost counted once (a
|
|
258
|
+
* project worked on by two teams).
|
|
259
|
+
*
|
|
260
|
+
* @param teamIds - Team ids
|
|
261
|
+
* @returns Extra tokens and unlimited
|
|
262
|
+
*/
|
|
263
|
+
boostForTeams(teamIds: readonly string[]): {
|
|
264
|
+
extra: number;
|
|
265
|
+
unlimited: boolean;
|
|
266
|
+
};
|
|
161
267
|
/**
|
|
162
268
|
* The stop in force for a session (the delivery / wake gate). Synchronous
|
|
163
|
-
* and live: it reads today's
|
|
269
|
+
* and live: it reads today's usage now, not at the last tick.
|
|
164
270
|
*
|
|
165
271
|
* @param session - Agent session
|
|
166
272
|
* @returns Stop, or null when the agent may run
|
|
@@ -174,26 +280,27 @@ export declare class SpendCapService implements SpendCapGate {
|
|
|
174
280
|
*/
|
|
175
281
|
displayNameOf(session: string): string;
|
|
176
282
|
/**
|
|
177
|
-
*
|
|
283
|
+
* An agent's own cap before boosts, and where it comes from.
|
|
178
284
|
*
|
|
179
|
-
* @param
|
|
285
|
+
* @param session - Agent session
|
|
180
286
|
* @returns Cap (null = none) and source
|
|
181
287
|
*/
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
source:
|
|
288
|
+
ownCapOf(session: string): {
|
|
289
|
+
capTokens: number | null;
|
|
290
|
+
source: CapSource;
|
|
185
291
|
};
|
|
186
292
|
/**
|
|
187
|
-
*
|
|
293
|
+
* Usage plus caps for the API / Settings panel.
|
|
188
294
|
*
|
|
189
295
|
* @param days - Window
|
|
190
296
|
* @returns View
|
|
191
297
|
*/
|
|
192
298
|
view(days?: number): Promise<SpendView>;
|
|
193
299
|
/**
|
|
194
|
-
* One enforcement pass: day roll, 80% notices, stop
|
|
195
|
-
* card per stop), and releasing agents whose stop
|
|
196
|
-
* one at a time; a call during a pass gets another
|
|
300
|
+
* One enforcement pass: day roll, boost expiry, 80% notices, stop
|
|
301
|
+
* announcements (one card per stop), and releasing agents whose stop
|
|
302
|
+
* lifted. Passes run one at a time; a call during a pass gets another
|
|
303
|
+
* pass after it.
|
|
197
304
|
*/
|
|
198
305
|
evaluate(): Promise<void>;
|
|
199
306
|
/**
|
|
@@ -204,12 +311,20 @@ export declare class SpendCapService implements SpendCapGate {
|
|
|
204
311
|
*/
|
|
205
312
|
onSettled(d: OwnerDecision): Promise<null>;
|
|
206
313
|
private evaluateOnce;
|
|
314
|
+
/**
|
|
315
|
+
* The cap in force for a cap target, with the boosts that cover the
|
|
316
|
+
* target itself (for notices and cards).
|
|
317
|
+
*/
|
|
318
|
+
private capForTarget;
|
|
207
319
|
private checkThresholds;
|
|
208
320
|
private announceStop;
|
|
209
321
|
private anyCap;
|
|
210
322
|
private computeStop;
|
|
211
323
|
private stopKey;
|
|
212
324
|
private scheduleEvaluate;
|
|
325
|
+
private activeBoostsRaw;
|
|
326
|
+
private pruneBoosts;
|
|
327
|
+
private resolveBoostTarget;
|
|
213
328
|
/** Reset today's bookkeeping when the local day changed. */
|
|
214
329
|
private rollDay;
|
|
215
330
|
private nextMidnight;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spend-cap.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap.service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"spend-cap.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap.service.ts"],"names":[],"mappings":"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"}
|