specweave 3.0.9 → 3.0.11
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/.claude-plugin/marketplace.json +2 -2
- package/bin/specweave.js +9 -7
- package/dist/src/cli/commands/auto-handoff.d.ts +21 -11
- package/dist/src/cli/commands/auto-handoff.d.ts.map +1 -1
- package/dist/src/cli/commands/auto-handoff.js +73 -32
- package/dist/src/cli/commands/auto-handoff.js.map +1 -1
- package/dist/src/core/session/usage-guard.d.ts +109 -23
- package/dist/src/core/session/usage-guard.d.ts.map +1 -1
- package/dist/src/core/session/usage-guard.js +280 -71
- package/dist/src/core/session/usage-guard.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave/skills/handoff/SKILL.md +13 -9
- package/src/templates/AGENTS.md.template +1 -1
|
@@ -12,14 +12,18 @@
|
|
|
12
12
|
* `rate_limits.primary` / `secondary` `.used_percent` to the
|
|
13
13
|
* rollout file the hook's `transcript_path` points at.
|
|
14
14
|
*
|
|
15
|
-
* The Stop hook (`specweave usage-guard`)
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
15
|
+
* The Stop hook (`specweave usage-guard`) acts once per session and usage
|
|
16
|
+
* window when any window is at or past the threshold (95% by default). In the
|
|
17
|
+
* default `suggest` mode it only tells the user, and the work goes on; in
|
|
18
|
+
* `enforce` mode it stops the session and the agent runs `specweave handoff`.
|
|
19
|
+
* When every full window resets within `waitUnder` minutes (30 by default) it
|
|
20
|
+
* does neither: waiting for the reset costs less than moving the work. Under
|
|
21
|
+
* the threshold it prints `{}`: no tokens, no files.
|
|
19
22
|
*
|
|
20
23
|
* It only asks inside a SpecWeave project (the hook's `cwd` is in one), since
|
|
21
|
-
* `specweave handoff` has nothing to hand off anywhere else
|
|
22
|
-
*
|
|
24
|
+
* `specweave handoff` has nothing to hand off anywhere else. A Codex plan with
|
|
25
|
+
* credits keeps working past 100%, so it is asked only when the session's own
|
|
26
|
+
* log shows under an hour of credits left at the rate they are being spent.
|
|
23
27
|
*
|
|
24
28
|
* Two more cases never steer the model. `mode: "checkpoint"` is for plans where
|
|
25
29
|
* credits or a proxy keep working past 100%: only local checkpoints are saved.
|
|
@@ -28,7 +32,11 @@
|
|
|
28
32
|
*
|
|
29
33
|
* @module core/session/usage-guard
|
|
30
34
|
*/
|
|
31
|
-
export declare const DEFAULT_THRESHOLD =
|
|
35
|
+
export declare const DEFAULT_THRESHOLD = 95;
|
|
36
|
+
/** When every full window resets sooner than this many minutes, waiting beats a handoff. */
|
|
37
|
+
export declare const DEFAULT_WAIT_UNDER_MINUTES = 30;
|
|
38
|
+
/** Settings files without this version were written before 3.0.11, when the only mode stopped the session. */
|
|
39
|
+
export declare const SETTINGS_VERSION = 2;
|
|
32
40
|
/** The shortest usage window; a session that hit the limit may hit it again after this. */
|
|
33
41
|
export declare const LIMIT_HIT_REARM_MS: number;
|
|
34
42
|
export interface UsageWindow {
|
|
@@ -39,20 +47,35 @@ export interface UsageWindow {
|
|
|
39
47
|
/** Unix seconds, when known. */
|
|
40
48
|
resetsAt?: number;
|
|
41
49
|
}
|
|
42
|
-
/**
|
|
43
|
-
|
|
50
|
+
/**
|
|
51
|
+
* `suggest`: at the threshold, tell the user once that a handoff is available and keep working.
|
|
52
|
+
* `enforce`: at the threshold, stop once and hand off.
|
|
53
|
+
* `checkpoint`: only save local checkpoints; usage never steers the model.
|
|
54
|
+
*/
|
|
55
|
+
export type AutoHandoffMode = 'suggest' | 'enforce' | 'checkpoint';
|
|
56
|
+
export declare const AUTO_HANDOFF_MODES: readonly AutoHandoffMode[];
|
|
44
57
|
export interface AutoHandoffSettings {
|
|
45
58
|
at: number;
|
|
46
|
-
/** Missing means `
|
|
59
|
+
/** Missing means `suggest`. Files written before 3.0.11 read as `suggest` unless they say `checkpoint`. */
|
|
47
60
|
mode?: AutoHandoffMode;
|
|
61
|
+
/** Minutes. When every window at the threshold resets sooner, nothing is suggested or enforced; 0 turns the rule off. */
|
|
62
|
+
waitUnder?: number;
|
|
63
|
+
version?: number;
|
|
48
64
|
since?: string;
|
|
49
65
|
/** Status line command that was there before `auto-handoff on`, restored by `off`. */
|
|
50
66
|
previousStatusLine?: unknown;
|
|
51
67
|
}
|
|
52
68
|
export declare function specweaveHome(home?: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* The stored settings, with defaults filled in. A file written before 3.0.11
|
|
71
|
+
* (no `version`) had one mode that stopped the session at 90%; it now reads as
|
|
72
|
+
* `suggest` at 95%, keeping `checkpoint` and any threshold the user chose.
|
|
73
|
+
*/
|
|
53
74
|
export declare function readSettings(home?: string): AutoHandoffSettings | undefined;
|
|
54
|
-
/** Whether these settings
|
|
75
|
+
/** Whether these settings let usage steer the model at all (suggest or enforce), not only save checkpoints. */
|
|
55
76
|
export declare function handsOff(settings: AutoHandoffSettings | undefined): boolean;
|
|
77
|
+
/** Whether these settings stop the session and hand off at the threshold. */
|
|
78
|
+
export declare function enforces(settings: AutoHandoffSettings | undefined): boolean;
|
|
56
79
|
/**
|
|
57
80
|
* The Studio thread this hook runs in, when SpecWeave Studio started the provider session.
|
|
58
81
|
* Any non-empty value counts: delegated worker ids carry `%` and `:` and must still
|
|
@@ -97,21 +120,46 @@ export declare function desktopUsageReading(opts?: {
|
|
|
97
120
|
now?: number;
|
|
98
121
|
platform?: NodeJS.Platform;
|
|
99
122
|
}): UsageReading | undefined;
|
|
100
|
-
/**
|
|
123
|
+
/**
|
|
124
|
+
* The freshest reading for a Claude Code session that runs no status line.
|
|
125
|
+
* Desktop samples carry no reset times; a window's reset does not move until
|
|
126
|
+
* it passes, so one still ahead in the usage cache is borrowed for it.
|
|
127
|
+
*/
|
|
101
128
|
export declare function claudeFallbackReading(opts?: {
|
|
102
129
|
env?: NodeJS.ProcessEnv;
|
|
103
130
|
home?: string;
|
|
104
131
|
now?: number;
|
|
105
132
|
platform?: NodeJS.Platform;
|
|
106
133
|
}): UsageReading | undefined;
|
|
107
|
-
/** What the newest `token_count`
|
|
134
|
+
/** What the newest `token_count` events in a Codex rollout file say about the plan. */
|
|
108
135
|
export interface CodexUsage {
|
|
109
136
|
windows: UsageWindow[];
|
|
110
137
|
/** Credits (or an unlimited plan) keep Codex working after a window is full. */
|
|
111
138
|
credits: boolean;
|
|
139
|
+
/**
|
|
140
|
+
* Minutes the credit balance lasts at the rate this log shows it falling.
|
|
141
|
+
* Undefined when the plan is unlimited or the log shows no fall to measure.
|
|
142
|
+
*/
|
|
143
|
+
creditMinutesLeft?: number;
|
|
112
144
|
}
|
|
113
|
-
/**
|
|
145
|
+
/** Credit balances older than this say nothing about the current rate. */
|
|
146
|
+
export declare const CREDIT_BURN_WINDOW_MS: number;
|
|
147
|
+
/** A Codex session with credits is asked to hand off when fewer minutes of credits are left. */
|
|
148
|
+
export declare const CREDIT_MINUTES_LOW = 60;
|
|
149
|
+
/**
|
|
150
|
+
* Windows and credits from the newest `token_count` event of the plan's own
|
|
151
|
+
* limit in a Codex rollout file. Codex logs several limits in one session; a
|
|
152
|
+
* later `gpt-reserve` record at 0% must not hide a plan window at 95%, so
|
|
153
|
+
* another bucket is used only when no plan record is found.
|
|
154
|
+
*
|
|
155
|
+
* For a plan with a finite credit balance the scan goes on, back to an hour
|
|
156
|
+
* before that record, to see how fast the balance is falling. It stops at a
|
|
157
|
+
* top-up (a record with no credits, or with less than half of today's
|
|
158
|
+
* balance): what was spent before one says nothing about what is left.
|
|
159
|
+
*/
|
|
114
160
|
export declare function codexUsage(transcriptPath: string): CodexUsage;
|
|
161
|
+
/** Whether a Codex plan's credits will carry the session on: it has some, and they are not about to run out. */
|
|
162
|
+
export declare function codexCreditsLast(usage: CodexUsage): boolean;
|
|
115
163
|
/** Windows from the newest `token_count` event in a Codex rollout file. */
|
|
116
164
|
export declare function codexWindows(transcriptPath: string): UsageWindow[];
|
|
117
165
|
export interface UsageReading {
|
|
@@ -119,8 +167,10 @@ export interface UsageReading {
|
|
|
119
167
|
/** Epoch milliseconds of the reading. */
|
|
120
168
|
at: number;
|
|
121
169
|
windows: UsageWindow[];
|
|
122
|
-
/** Codex only: credits keep it working past a full window, so it is
|
|
170
|
+
/** Codex only: credits keep it working past a full window, so it is not asked to hand off while they last. */
|
|
123
171
|
credits?: boolean;
|
|
172
|
+
/** Codex only: minutes of credits left at the rate the newest session log shows, when it shows one. */
|
|
173
|
+
creditMinutesLeft?: number;
|
|
124
174
|
}
|
|
125
175
|
/** The newest usage any Claude Code session's status line recorded. */
|
|
126
176
|
export declare function latestClaudeReading(home?: string): UsageReading | undefined;
|
|
@@ -128,7 +178,30 @@ export declare function latestClaudeReading(home?: string): UsageReading | undef
|
|
|
128
178
|
export declare function latestCodexReading(home?: string): UsageReading | undefined;
|
|
129
179
|
/** The fullest window that has not reset yet. */
|
|
130
180
|
export declare function fullest(windows: UsageWindow[], now?: number): UsageWindow | undefined;
|
|
131
|
-
|
|
181
|
+
/** "25 min", "2 h 10 min", "4 days". */
|
|
182
|
+
export declare function minutesPhrase(minutes: number): string;
|
|
183
|
+
/**
|
|
184
|
+
* What the guard does about the usage it read:
|
|
185
|
+
* `none` under the threshold, or usage never steers the model (checkpoint mode);
|
|
186
|
+
* `wait` at the threshold, but every full window resets within `waitUnder` minutes;
|
|
187
|
+
* `suggest` tell the user once that a handoff is available, keep working;
|
|
188
|
+
* `enforce` stop once and hand off.
|
|
189
|
+
* `resetMinutes` is when the last of the full windows resets, when every one of them says.
|
|
190
|
+
*/
|
|
191
|
+
export type UsageDecision = {
|
|
192
|
+
kind: 'none';
|
|
193
|
+
} | {
|
|
194
|
+
kind: 'wait' | 'suggest' | 'enforce';
|
|
195
|
+
window: UsageWindow;
|
|
196
|
+
resetMinutes?: number;
|
|
197
|
+
};
|
|
198
|
+
/** Minutes until every given window has reset, or undefined when one of them has no reset time. */
|
|
199
|
+
export declare function minutesUntilReset(windows: UsageWindow[], now?: number): number | undefined;
|
|
200
|
+
export declare function usageDecision(settings: AutoHandoffSettings | undefined, windows: UsageWindow[], now?: number): UsageDecision;
|
|
201
|
+
/** `creditMinutes`: a Codex plan that got this far on credits, with about that many minutes of them left. */
|
|
202
|
+
export declare function handoffInstruction(w: UsageWindow, creditMinutes?: number, resetMinutes?: number): string;
|
|
203
|
+
/** The `suggest` mode note: the model tells the user once and does not stop on its own account. */
|
|
204
|
+
export declare function suggestionInstruction(w: UsageWindow, creditMinutes?: number, resetMinutes?: number): string;
|
|
132
205
|
export interface GuardInput {
|
|
133
206
|
session_id?: string;
|
|
134
207
|
/** Where the session runs; both tools send it. */
|
|
@@ -153,9 +226,12 @@ export interface GuardOutput {
|
|
|
153
226
|
}
|
|
154
227
|
/**
|
|
155
228
|
* Stop-hook output. The first time a session is at or past the threshold in a
|
|
156
|
-
* usage window, it keeps the agent going
|
|
157
|
-
*
|
|
158
|
-
*
|
|
229
|
+
* usage window, it keeps the agent going for one more reply: to tell the user
|
|
230
|
+
* a handoff is available (`suggest`) or to hand off (`enforce`); otherwise `{}`.
|
|
231
|
+
* Also `{}` when every full window resets within `waitUnder` minutes, outside
|
|
232
|
+
* a SpecWeave project (a plain chat has nothing to hand off) and for a Codex
|
|
233
|
+
* plan whose credits keep it working past the limit, until they are about to
|
|
234
|
+
* run out.
|
|
159
235
|
*/
|
|
160
236
|
export declare function usageGuard(input: GuardInput, opts?: {
|
|
161
237
|
home?: string;
|
|
@@ -179,17 +255,27 @@ export interface LimitHitInput {
|
|
|
179
255
|
workspaceRoot?: string;
|
|
180
256
|
error?: string;
|
|
181
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* Minutes until a session that just hit the limit can go on: when the last
|
|
260
|
+
* full window resets. The reading may predate the jump to 100%, so with no
|
|
261
|
+
* window at the threshold the fullest one counts. Undefined when unknown.
|
|
262
|
+
*/
|
|
263
|
+
export declare function limitResetMinutes(windows: UsageWindow[], at: number, now?: number): number | undefined;
|
|
182
264
|
/**
|
|
183
265
|
* Where a rate-limited turn should hand off, or undefined when it should not:
|
|
184
266
|
* auto-handoff is off or checkpoint-only, the session runs inside Studio, the
|
|
185
|
-
* failure is not a rate limit, the
|
|
186
|
-
*
|
|
187
|
-
*
|
|
188
|
-
*
|
|
267
|
+
* failure is not a rate limit, the limit resets within `waitUnder` minutes
|
|
268
|
+
* (the session can wait it out), the session already wrote one in the last
|
|
269
|
+
* five hours, or the directory is not a SpecWeave project. Both `suggest` and
|
|
270
|
+
* `enforce` hand off here: the session cannot go on, so this is the last
|
|
271
|
+
* moment to write the handoff. Writes its marker before returning, so a retry
|
|
272
|
+
* storm hands off once. The marker is separate from the Stop hook's: a session
|
|
273
|
+
* that was asked at the threshold and still ran out writes a fresh handoff.
|
|
189
274
|
*/
|
|
190
275
|
export declare function limitHitTarget(input: LimitHitInput, opts?: {
|
|
191
276
|
home?: string;
|
|
192
277
|
now?: number;
|
|
193
278
|
env?: NodeJS.ProcessEnv;
|
|
279
|
+
platform?: NodeJS.Platform;
|
|
194
280
|
}): string | undefined;
|
|
195
281
|
//# sourceMappingURL=usage-guard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-guard.d.ts","sourceRoot":"","sources":["../../../../src/core/session/usage-guard.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"usage-guard.d.ts","sourceRoot":"","sources":["../../../../src/core/session/usage-guard.ts"],"names":[],"mappings":"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"}
|