@osovv/vv-opencode 1.3.5 → 1.3.6-rc.1

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.
@@ -0,0 +1,384 @@
1
+ // FILE: src/lib/peak-hours.ts
2
+ // VERSION: 1.0.0
3
+ // START_MODULE_CONTRACT
4
+ // PURPOSE: Pure provider-level peak-hours schedule evaluation shared by the peak-hours server plugin and TUI banner.
5
+ // SCOPE: Window parsing with explicit timezones, cross-midnight and weekday handling, provider id normalization and aliases, active-window lookup with end boundaries, connected-provider suggestion filtering, plugin entry parsing, and bounded display formatting.
6
+ // DEPENDS: [none]
7
+ // LINKS: [M-PEAK-HOURS-SCHEDULES, M-PLUGIN-PEAK-HOURS, M-TUI-PEAK-HOURS-BANNER]
8
+ // ROLE: RUNTIME
9
+ // MAP_MODE: EXPORTS
10
+ // END_MODULE_CONTRACT
11
+ //
12
+ // START_MODULE_MAP
13
+ // PeakWindowSpec - Raw window shape from configuration with start, end, optional tz, and optional days.
14
+ // PeakProviderSchedule - Per-provider schedule with optional mode override and windows.
15
+ // PeakSchedules - Provider-keyed schedule map.
16
+ // ParsedPeakWindow - Validated window with minute offsets, timezone, sorted days, and cross-midnight flag.
17
+ // PeakHoursClock - Injectable clock returning the current Date.
18
+ // PeakHoursMode - Soft or hard enforcement mode.
19
+ // PeakHoursEntryConfig - Fully seeded plugin entry shape used by the server plugin and banner.
20
+ // ActivePeak - Active window hit with provider ids, boundary dates, and remaining minutes.
21
+ // DEFAULT_PEAK_TIMEZONE - Default window timezone (UTC).
22
+ // DEFAULT_PEAK_HOURS_MODE - Default enforcement mode (hard).
23
+ // ALL_WEEKDAYS - All seven weekday indexes.
24
+ // PROVIDER_KEY_ALIASES - Known provider id spellings mapped onto canonical schedule keys.
25
+ // normalizeProviderId - Lowercases, trims, and canonicalizes separators in a provider id.
26
+ // resolveProviderKey - Maps a provider id onto a schedule key through exact and alias matching.
27
+ // parseTimeOfDay - Parses HH:MM into minutes past midnight.
28
+ // parsePeakWindow - Validates one raw window and returns it with a warning on malformed input.
29
+ // findActivePeak - Returns the active window hit for a provider at a time, if any.
30
+ // suggestOffPeakProviders - Filters connected provider ids down to those outside active peak windows.
31
+ // formatWaitMinutes - Renders remaining minutes as a bounded human string.
32
+ // formatPeakEndTime - Renders a window end instant as a deterministic HH:MM UTC label.
33
+ // parsePeakHoursEntry - Normalizes a plugins["peak-hours"] value into a seeded entry with warnings.
34
+ // END_MODULE_MAP
35
+ //
36
+ // START_CHANGE_SUMMARY
37
+ // LAST_CHANGE: [DIRECT-FIX - Restricted gating to subscription plan provider ids from the models.dev registry; bare pay-per-token APIs are never gated.]
38
+ // END_CHANGE_SUMMARY
39
+ export const DEFAULT_PEAK_TIMEZONE = "UTC";
40
+ export const DEFAULT_PEAK_HOURS_MODE = "hard";
41
+ export const ALL_WEEKDAYS = [0, 1, 2, 3, 4, 5, 6];
42
+ const MINUTES_PER_DAY = 1_440;
43
+ const WEEKDAY_INDEX = {
44
+ Sun: 0,
45
+ Mon: 1,
46
+ Tue: 2,
47
+ Wed: 3,
48
+ Thu: 4,
49
+ Fri: 5,
50
+ Sat: 6,
51
+ };
52
+ // Provider ids observed in the OpenCode provider registry (models.dev) that
53
+ // bill peak-hour premiums on subscription plans. Canonical schedule keys:
54
+ // deepseek, z-ai, qwen. Bare pay-per-token API providers (zai, zhipuai,
55
+ // alibaba, alibaba-cn) are deliberately NOT gated: their tariffs publish no
56
+ // peak surcharge. GLM Coding Plans and Alibaba Token Plans are gated.
57
+ export const PROVIDER_KEY_ALIASES = {
58
+ "zai-coding-plan": "z-ai",
59
+ "zhipuai-coding-plan": "z-ai",
60
+ "alibaba-token-plan": "qwen",
61
+ "alibaba-token-plan-cn": "qwen",
62
+ };
63
+ // START_CONTRACT: normalizeProviderId
64
+ // PURPOSE: Canonicalize a provider id for schedule matching.
65
+ // INPUTS: { id: string - provider id as observed from OpenCode surfaces }
66
+ // OUTPUTS: { string - lowercased id with whitespace and underscores folded to single hyphens }
67
+ // SIDE_EFFECTS: none
68
+ // LINKS: resolveProviderKey
69
+ // END_CONTRACT: normalizeProviderId
70
+ export function normalizeProviderId(id) {
71
+ return id
72
+ .trim()
73
+ .toLowerCase()
74
+ .replace(/[\s_]+/g, "-");
75
+ }
76
+ // START_CONTRACT: resolveProviderKey
77
+ // PURPOSE: Map an observed provider id onto a schedule key via exact then alias matching.
78
+ // INPUTS: { providerID: string - observed provider id; schedules: PeakSchedules - loaded schedule map }
79
+ // OUTPUTS: { string | undefined - matching schedule key, or undefined when the provider owns no schedule }
80
+ // SIDE_EFFECTS: none
81
+ // LINKS: normalizeProviderId, PROVIDER_KEY_ALIASES
82
+ // END_CONTRACT: resolveProviderKey
83
+ export function resolveProviderKey(providerID, schedules) {
84
+ const normalized = normalizeProviderId(providerID);
85
+ if (normalized && schedules[normalized]) {
86
+ return normalized;
87
+ }
88
+ const aliased = PROVIDER_KEY_ALIASES[normalized];
89
+ if (aliased && schedules[aliased]) {
90
+ return aliased;
91
+ }
92
+ return undefined;
93
+ }
94
+ // START_CONTRACT: parseTimeOfDay
95
+ // PURPOSE: Parse an HH:MM string into minutes past midnight.
96
+ // INPUTS: { value: string - candidate time-of-day string }
97
+ // OUTPUTS: { number | undefined - minutes 0 through 1439, or undefined for malformed input }
98
+ // SIDE_EFFECTS: none
99
+ // LINKS: parsePeakWindow
100
+ // END_CONTRACT: parseTimeOfDay
101
+ export function parseTimeOfDay(value) {
102
+ const match = /^([01]\d|2[0-3]):([0-5]\d)$/.exec(value.trim());
103
+ if (!match)
104
+ return undefined;
105
+ return Number(match[1]) * 60 + Number(match[2]);
106
+ }
107
+ function isValidTimezone(timeZone) {
108
+ try {
109
+ new Intl.DateTimeFormat("en-US", { timeZone });
110
+ return true;
111
+ }
112
+ catch {
113
+ return false;
114
+ }
115
+ }
116
+ // START_CONTRACT: parsePeakWindow
117
+ // PURPOSE: Validate one raw window spec and return the parsed window, failing open with a warning.
118
+ // INPUTS: { spec: unknown - raw window value from configuration }
119
+ // OUTPUTS: { { window?: ParsedPeakWindow; warning?: string } - parsed window when valid, or a warning string when malformed }
120
+ // SIDE_EFFECTS: none
121
+ // LINKS: parseTimeOfDay
122
+ // END_CONTRACT: parsePeakWindow
123
+ export function parsePeakWindow(spec) {
124
+ if (!spec || typeof spec !== "object" || Array.isArray(spec)) {
125
+ return { warning: "window must be an object" };
126
+ }
127
+ const record = spec;
128
+ const start = typeof record.start === "string" ? record.start.trim() : "";
129
+ const end = typeof record.end === "string" ? record.end.trim() : "";
130
+ const startMinutes = start ? parseTimeOfDay(start) : undefined;
131
+ const endMinutes = end ? parseTimeOfDay(end) : undefined;
132
+ if (startMinutes === undefined || endMinutes === undefined) {
133
+ return { warning: `window has invalid start or end time (${start}..${end})` };
134
+ }
135
+ if (startMinutes === endMinutes) {
136
+ return { warning: `window start and end must differ (${start}..${end})` };
137
+ }
138
+ const tz = typeof record.tz === "string" && record.tz.trim() ? record.tz.trim() : DEFAULT_PEAK_TIMEZONE;
139
+ if (!isValidTimezone(tz)) {
140
+ return { warning: `window has invalid tz (${tz})` };
141
+ }
142
+ let days = [...ALL_WEEKDAYS];
143
+ if (record.days !== undefined) {
144
+ if (!Array.isArray(record.days) || record.days.length === 0) {
145
+ return { warning: "window days must be a non-empty array of integers 0 through 6" };
146
+ }
147
+ const parsedDays = [...new Set(record.days)].map((day) => Number(day));
148
+ if (parsedDays.some((day) => !Number.isInteger(day) || day < 0 || day > 6)) {
149
+ return { warning: "window days must be integers 0 through 6" };
150
+ }
151
+ days = parsedDays.sort((left, right) => left - right);
152
+ }
153
+ return {
154
+ window: {
155
+ startMinutes,
156
+ endMinutes,
157
+ crossMidnight: endMinutes < startMinutes,
158
+ tz,
159
+ days,
160
+ },
161
+ };
162
+ }
163
+ function zonedParts(date, timeZone) {
164
+ const formatter = new Intl.DateTimeFormat("en-US", {
165
+ timeZone,
166
+ hour12: false,
167
+ weekday: "short",
168
+ hour: "2-digit",
169
+ minute: "2-digit",
170
+ });
171
+ const parts = formatter.formatToParts(date);
172
+ const weekdayName = parts.find((part) => part.type === "weekday")?.value ?? "";
173
+ const rawHour = Number(parts.find((part) => part.type === "hour")?.value);
174
+ const minute = Number(parts.find((part) => part.type === "minute")?.value);
175
+ const weekday = WEEKDAY_INDEX[weekdayName] ?? -1;
176
+ // Some ICU builds render midnight as hour 24 with hour12: false.
177
+ const hour = rawHour === 24 ? 0 : rawHour;
178
+ if (weekday < 0 || !Number.isFinite(hour) || !Number.isFinite(minute)) {
179
+ return { weekday: -1, minutes: 0 };
180
+ }
181
+ return { weekday, minutes: hour * 60 + minute };
182
+ }
183
+ function evaluateWindow(window, now) {
184
+ const { weekday, minutes } = zonedParts(now, window.tz);
185
+ if (weekday < 0)
186
+ return { active: false, minutesRemaining: 0 };
187
+ const previousWeekday = (weekday + 6) % 7;
188
+ if (!window.crossMidnight) {
189
+ const active = window.days.includes(weekday) &&
190
+ minutes >= window.startMinutes &&
191
+ minutes < window.endMinutes;
192
+ return { active, minutesRemaining: active ? window.endMinutes - minutes : 0 };
193
+ }
194
+ // Cross-midnight windows open on a listed day and run into the next day.
195
+ if (window.days.includes(weekday) && minutes >= window.startMinutes) {
196
+ return { active: true, minutesRemaining: MINUTES_PER_DAY - minutes + window.endMinutes };
197
+ }
198
+ if (window.days.includes(previousWeekday) && minutes < window.endMinutes) {
199
+ return { active: true, minutesRemaining: window.endMinutes - minutes };
200
+ }
201
+ return { active: false, minutesRemaining: 0 };
202
+ }
203
+ function windowDurationMinutes(window) {
204
+ return window.crossMidnight
205
+ ? MINUTES_PER_DAY - window.startMinutes + window.endMinutes
206
+ : window.endMinutes - window.startMinutes;
207
+ }
208
+ // START_CONTRACT: findActivePeak
209
+ // PURPOSE: Find the active peak window hit for a provider at a given time.
210
+ // INPUTS: { now: Date - evaluation instant; schedules: PeakSchedules - loaded schedule map; providerID: string - observed provider id }
211
+ // OUTPUTS: { ActivePeak | undefined - hit with boundaries and remaining minutes, or undefined when not in peak or unscheduled }
212
+ // SIDE_EFFECTS: none
213
+ // LINKS: resolveProviderKey, parsePeakWindow
214
+ // END_CONTRACT: findActivePeak
215
+ export function findActivePeak(now, schedules, providerID) {
216
+ const providerKey = resolveProviderKey(providerID, schedules);
217
+ if (!providerKey)
218
+ return undefined;
219
+ const schedule = schedules[providerKey];
220
+ if (!schedule || !Array.isArray(schedule.windows))
221
+ return undefined;
222
+ let best;
223
+ for (const rawWindow of schedule.windows) {
224
+ const { window } = parsePeakWindow(rawWindow);
225
+ if (!window)
226
+ continue;
227
+ const result = evaluateWindow(window, now);
228
+ if (result.active && (!best || result.minutesRemaining > best.minutesRemaining)) {
229
+ best = { window, minutesRemaining: result.minutesRemaining };
230
+ }
231
+ }
232
+ if (!best)
233
+ return undefined;
234
+ const durationMinutes = windowDurationMinutes(best.window);
235
+ const endsAtMs = now.getTime() + best.minutesRemaining * 60_000;
236
+ return {
237
+ providerKey,
238
+ providerID,
239
+ window: best.window,
240
+ endsAt: new Date(endsAtMs),
241
+ startedAt: new Date(endsAtMs - durationMinutes * 60_000),
242
+ minutesRemaining: best.minutesRemaining,
243
+ };
244
+ }
245
+ // START_CONTRACT: suggestOffPeakProviders
246
+ // PURPOSE: Filter connected provider ids down to those currently outside any active peak window.
247
+ // INPUTS: { now: Date - evaluation instant; schedules: PeakSchedules - loaded schedule map; connectedProviderIDs: readonly string[] - observed connected provider ids in display order }
248
+ // OUTPUTS: { string[] - original provider ids not currently in peak, deduplicated, preserving input order }
249
+ // SIDE_EFFECTS: none
250
+ // LINKS: findActivePeak, normalizeProviderId
251
+ // END_CONTRACT: suggestOffPeakProviders
252
+ export function suggestOffPeakProviders(now, schedules, connectedProviderIDs) {
253
+ const seen = new Set();
254
+ const suggestions = [];
255
+ for (const providerID of connectedProviderIDs) {
256
+ if (typeof providerID !== "string" || !providerID.trim())
257
+ continue;
258
+ const normalized = normalizeProviderId(providerID);
259
+ if (seen.has(normalized))
260
+ continue;
261
+ seen.add(normalized);
262
+ if (!findActivePeak(now, schedules, providerID)) {
263
+ suggestions.push(providerID);
264
+ }
265
+ }
266
+ return suggestions;
267
+ }
268
+ // START_CONTRACT: formatWaitMinutes
269
+ // PURPOSE: Render remaining minutes as a bounded human-readable string.
270
+ // INPUTS: { minutes: number - remaining whole minutes }
271
+ // OUTPUTS: { string - "N min" below an hour, otherwise "H h M min" }
272
+ // SIDE_EFFECTS: none
273
+ // LINKS: none
274
+ // END_CONTRACT: formatWaitMinutes
275
+ export function formatWaitMinutes(minutes) {
276
+ const bounded = Math.max(0, Math.round(minutes));
277
+ if (bounded < 60)
278
+ return `${bounded} min`;
279
+ const hours = Math.floor(bounded / 60);
280
+ const remainder = bounded % 60;
281
+ return remainder === 0 ? `${hours} h` : `${hours} h ${remainder} min`;
282
+ }
283
+ // START_CONTRACT: formatPeakEndTime
284
+ // PURPOSE: Render a window end instant as a deterministic UTC label.
285
+ // INPUTS: { date: Date - window end instant }
286
+ // OUTPUTS: { string - "HH:MM UTC" label }
287
+ // SIDE_EFFECTS: none
288
+ // LINKS: none
289
+ // END_CONTRACT: formatPeakEndTime
290
+ export function formatPeakEndTime(date) {
291
+ return `${date.toISOString().slice(11, 16)} UTC`;
292
+ }
293
+ // START_CONTRACT: parsePeakHoursEntry
294
+ // PURPOSE: Normalize a plugins["peak-hours"] value into a seeded entry, failing open on malformed pieces.
295
+ // INPUTS: { value: unknown - boolean, object, or undefined plugin entry value from the vvoc config }
296
+ // OUTPUTS: { { entry: PeakHoursEntryConfig; warnings: string[] } - seeded entry plus warnings for skipped malformed pieces }
297
+ // SIDE_EFFECTS: none
298
+ // LINKS: parsePeakWindow, DEFAULT_PEAK_HOURS_MODE
299
+ // END_CONTRACT: parsePeakHoursEntry
300
+ export function parsePeakHoursEntry(value) {
301
+ const warnings = [];
302
+ const entry = {
303
+ enabled: true,
304
+ mode: DEFAULT_PEAK_HOURS_MODE,
305
+ graceActiveSessions: true,
306
+ schedules: {},
307
+ };
308
+ if (value === undefined || typeof value === "boolean") {
309
+ if (value === false)
310
+ entry.enabled = false;
311
+ return { entry, warnings };
312
+ }
313
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
314
+ warnings.push("plugins[peak-hours] must be a boolean or an object; using defaults");
315
+ return { entry, warnings };
316
+ }
317
+ const record = value;
318
+ if (record.enabled !== undefined) {
319
+ if (typeof record.enabled === "boolean") {
320
+ entry.enabled = record.enabled;
321
+ }
322
+ else {
323
+ warnings.push("plugins[peak-hours].enabled must be a boolean; using default");
324
+ }
325
+ }
326
+ if (record.mode !== undefined) {
327
+ if (record.mode === "soft" || record.mode === "hard") {
328
+ entry.mode = record.mode;
329
+ }
330
+ else {
331
+ warnings.push(`plugins[peak-hours].mode must be "soft" or "hard"; using ${entry.mode}`);
332
+ }
333
+ }
334
+ if (record.graceActiveSessions !== undefined) {
335
+ if (typeof record.graceActiveSessions === "boolean") {
336
+ entry.graceActiveSessions = record.graceActiveSessions;
337
+ }
338
+ else {
339
+ warnings.push("plugins[peak-hours].graceActiveSessions must be a boolean; using default");
340
+ }
341
+ }
342
+ if (record.schedules !== undefined) {
343
+ if (!record.schedules ||
344
+ typeof record.schedules !== "object" ||
345
+ Array.isArray(record.schedules)) {
346
+ warnings.push("plugins[peak-hours].schedules must be an object; ignoring schedules");
347
+ }
348
+ else {
349
+ for (const [providerKey, providerValue] of Object.entries(record.schedules)) {
350
+ if (!providerValue || typeof providerValue !== "object" || Array.isArray(providerValue)) {
351
+ warnings.push(`schedules["${providerKey}"] must be an object; skipped`);
352
+ continue;
353
+ }
354
+ const providerRecord = providerValue;
355
+ if (providerRecord.windows !== undefined && !Array.isArray(providerRecord.windows)) {
356
+ warnings.push(`schedules["${providerKey}"].windows must be an array; skipped`);
357
+ continue;
358
+ }
359
+ const windows = [];
360
+ if (Array.isArray(providerRecord.windows)) {
361
+ for (const rawWindow of providerRecord.windows) {
362
+ const parsed = parsePeakWindow(rawWindow);
363
+ if (parsed.window && typeof rawWindow === "object" && rawWindow !== null) {
364
+ windows.push(rawWindow);
365
+ }
366
+ else if (parsed.warning) {
367
+ warnings.push(`schedules["${providerKey}"]: ${parsed.warning}`);
368
+ }
369
+ }
370
+ }
371
+ const providerSchedule = { windows };
372
+ if (providerRecord.mode === "soft" || providerRecord.mode === "hard") {
373
+ providerSchedule.mode = providerRecord.mode;
374
+ }
375
+ else if (providerRecord.mode !== undefined) {
376
+ warnings.push(`schedules["${providerKey}"].mode must be "soft" or "hard"; ignored`);
377
+ }
378
+ entry.schedules[providerKey] = providerSchedule;
379
+ }
380
+ }
381
+ }
382
+ return { entry, warnings };
383
+ }
384
+ //# sourceMappingURL=peak-hours.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peak-hours.js","sourceRoot":"","sources":["../../src/lib/peak-hours.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export declare const PLUGIN_TOGGLE_NAMES: readonly ["guardian", "hashline-edit", "model-roles", "system-context-injection", "workflow", "secrets-redaction", "context", "web-tools", "tool-history-compaction", "analytics"];
1
+ export declare const PLUGIN_TOGGLE_NAMES: readonly ["guardian", "hashline-edit", "model-roles", "system-context-injection", "workflow", "secrets-redaction", "context", "web-tools", "tool-history-compaction", "analytics", "peak-hours"];
2
2
  export type VvocPluginEntryConfig = {
3
3
  enabled?: boolean;
4
4
  routing?: Record<string, unknown>;
@@ -28,6 +28,68 @@ export declare const DEFAULT_TOOL_HISTORY_COMPACTION_ENTRY: {
28
28
  readonly readSlim: true;
29
29
  readonly retainTools: readonly ["webfetch", "web_fetch", "web-reader", "webreader", "search", "brave", "skill", "task", "agent"];
30
30
  };
31
+ export declare const DEFAULT_PEAK_HOURS_SCHEDULES_REVISION = "2026-08-21";
32
+ export declare const DEFAULT_PEAK_HOURS_SCHEDULES: {
33
+ readonly deepseek: {
34
+ readonly windows: readonly [{
35
+ readonly start: "01:00";
36
+ readonly end: "04:00";
37
+ readonly tz: "UTC";
38
+ }, {
39
+ readonly start: "06:00";
40
+ readonly end: "10:00";
41
+ readonly tz: "UTC";
42
+ }];
43
+ };
44
+ readonly "z-ai": {
45
+ readonly windows: readonly [{
46
+ readonly start: "06:00";
47
+ readonly end: "10:00";
48
+ readonly tz: "UTC";
49
+ readonly days: readonly [1, 2, 3, 4, 5];
50
+ }];
51
+ };
52
+ readonly qwen: {
53
+ readonly windows: readonly [{
54
+ readonly start: "00:00";
55
+ readonly end: "14:00";
56
+ readonly tz: "UTC";
57
+ }];
58
+ };
59
+ };
60
+ export declare const DEFAULT_PEAK_HOURS_ENTRY: {
61
+ readonly enabled: true;
62
+ readonly mode: "hard";
63
+ readonly graceActiveSessions: true;
64
+ readonly schedules: {
65
+ readonly deepseek: {
66
+ readonly windows: readonly [{
67
+ readonly start: "01:00";
68
+ readonly end: "04:00";
69
+ readonly tz: "UTC";
70
+ }, {
71
+ readonly start: "06:00";
72
+ readonly end: "10:00";
73
+ readonly tz: "UTC";
74
+ }];
75
+ };
76
+ readonly "z-ai": {
77
+ readonly windows: readonly [{
78
+ readonly start: "06:00";
79
+ readonly end: "10:00";
80
+ readonly tz: "UTC";
81
+ readonly days: readonly [1, 2, 3, 4, 5];
82
+ }];
83
+ };
84
+ readonly qwen: {
85
+ readonly windows: readonly [{
86
+ readonly start: "00:00";
87
+ readonly end: "14:00";
88
+ readonly tz: "UTC";
89
+ }];
90
+ };
91
+ };
92
+ };
31
93
  export declare function createDefaultPluginToggleConfig(): VvocPluginToggleConfig;
32
94
  /**
33
95
  * Materialize the hashline-edit plugin entry so the edit-routing table is always
@@ -45,6 +107,14 @@ export declare function materializeHashlineEditEntry(current: boolean | VvocPlug
45
107
  * with defaults.
46
108
  */
47
109
  export declare function materializeToolHistoryCompactionEntry(current: boolean | VvocPluginEntryConfig | undefined): VvocPluginEntryConfig;
110
+ /**
111
+ * Materialize the peak-hours plugin entry so defaults are always present in
112
+ * vvoc.json. Conservative: user values are never overwritten. Boolean or
113
+ * missing entries expand to the full default entry with the revision-dated
114
+ * schedules; object entries keep their enabled flag, mode, grace flag, and any
115
+ * user-provided schedules object, filling only absent keys with defaults.
116
+ */
117
+ export declare function materializePeakHoursEntry(current: boolean | VvocPluginEntryConfig | undefined): VvocPluginEntryConfig;
48
118
  export declare function isPluginEnabled(config: {
49
119
  plugins?: VvocPluginToggleConfig;
50
120
  }, pluginName: string): boolean;
@@ -2,9 +2,9 @@
2
2
  // VERSION: 1.4.0
3
3
  // START_MODULE_CONTRACT
4
4
  // PURPOSE: Define canonical plugin toggle names, default-all-true values, and a pure plugin-enabled helper for loaded vvoc config snapshots.
5
- // SCOPE: Plugin name constants, default config builder, default hashline edit-routing table, default tool-history-compaction entry, conservative plugin entry materialization, pure toggle checks, and the toggle config type.
5
+ // SCOPE: Plugin name constants, default config builder, default hashline edit-routing table, default tool-history-compaction entry, revision-dated default peak-hours schedules and entry, conservative plugin entry materialization, pure toggle checks, and the toggle config type.
6
6
  // DEPENDS: [none]
7
- // LINKS: [M-PLUGIN-TOGGLE-CONFIG, M-CLI-CONFIG]
7
+ // LINKS: [M-PLUGIN-TOGGLE-CONFIG, M-CLI-CONFIG, M-PEAK-HOURS-SCHEDULES]
8
8
  // ROLE: RUNTIME
9
9
  // MAP_MODE: EXPORTS
10
10
  // END_MODULE_CONTRACT
@@ -17,14 +17,18 @@
17
17
  // DEFAULT_HASHLINE_EDIT_ROUTING - Default edit-routing table materialized into vvoc.json for the hashline-edit plugin.
18
18
  // DEFAULT_TOOL_HISTORY_COMPACTION_RETAIN_TOOLS - Default knowledge-tool retention substrings for tool-history-compaction.
19
19
  // DEFAULT_TOOL_HISTORY_COMPACTION_ENTRY - Default materializable config entry for tool-history-compaction.
20
+ // DEFAULT_PEAK_HOURS_SCHEDULES_REVISION - Revision date of the built-in peak-hours schedule data.
21
+ // DEFAULT_PEAK_HOURS_SCHEDULES - Revision-dated built-in provider peak windows for the peak-hours plugin.
22
+ // DEFAULT_PEAK_HOURS_ENTRY - Default materializable config entry for the peak-hours plugin.
20
23
  // materializeHashlineEditEntry - Expand the hashline-edit entry so the routing table is present without overwriting user values.
21
24
  // materializeToolHistoryCompactionEntry - Expand the tool-history-compaction entry so the compaction config is present without overwriting user values.
25
+ // materializePeakHoursEntry - Expand the peak-hours entry so defaults are present without overwriting user values.
22
26
  // isPluginEnabled - Returns whether the named plugin is enabled in a loaded vvoc config object.
23
27
  // isVvocPluginEnabled - Alias for isPluginEnabled with explicit vvoc naming.
24
28
  // END_MODULE_MAP
25
29
  //
26
30
  // START_CHANGE_SUMMARY
27
- // LAST_CHANGE: [2026-08-19-cache-hit-rate-analytics - Added the analytics plugin toggle name.]
31
+ // LAST_CHANGE: [C-PLUGIN-PEAK-HOURS - Added the peak-hours toggle name, revision-dated default schedules, and conservative entry materialization.]
28
32
  // END_CHANGE_SUMMARY
29
33
  // START_BLOCK_CONSTANTS
30
34
  export const PLUGIN_TOGGLE_NAMES = [
@@ -38,6 +42,7 @@ export const PLUGIN_TOGGLE_NAMES = [
38
42
  "web-tools",
39
43
  "tool-history-compaction",
40
44
  "analytics",
45
+ "peak-hours",
41
46
  ];
42
47
  // Default edit-routing table for the hashline-edit plugin. Materialized into vvoc.json
43
48
  // on sync/init so it is visible and editable; kept as a plain config-shape object
@@ -80,6 +85,38 @@ export const DEFAULT_TOOL_HISTORY_COMPACTION_ENTRY = {
80
85
  retainTools: [...DEFAULT_TOOL_HISTORY_COMPACTION_RETAIN_TOOLS],
81
86
  };
82
87
  // END_BLOCK_TOOL_HISTORY_DEFAULTS
88
+ // START_BLOCK_PEAK_HOURS_DEFAULTS
89
+ // Revision-dated best-effort peak windows verified on 2026-08-21 from provider
90
+ // documentation; users own their copy after materialization and providers move
91
+ // these clocks. deepseek: x2 surcharge windows effective 2026-08-16
92
+ // (api-docs.deepseek.com). z-ai: GLM Coding Plan weekday clock, 14:00-18:00
93
+ // UTC+8 (docs.z.ai), matching the zai-coding-plan and zhipuai-coding-plan
94
+ // provider ids. qwen: Alibaba Token Plan off-peak 22:00-08:00 UTC+8, i.e. peak
95
+ // 00:00-14:00 UTC daily, matching the alibaba-token-plan and
96
+ // alibaba-token-plan-cn provider ids. Bare pay-per-token API providers (zai,
97
+ // zhipuai, alibaba, alibaba-cn) publish no peak surcharge and are never gated.
98
+ export const DEFAULT_PEAK_HOURS_SCHEDULES_REVISION = "2026-08-21";
99
+ export const DEFAULT_PEAK_HOURS_SCHEDULES = {
100
+ deepseek: {
101
+ windows: [
102
+ { start: "01:00", end: "04:00", tz: "UTC" },
103
+ { start: "06:00", end: "10:00", tz: "UTC" },
104
+ ],
105
+ },
106
+ "z-ai": {
107
+ windows: [{ start: "06:00", end: "10:00", tz: "UTC", days: [1, 2, 3, 4, 5] }],
108
+ },
109
+ qwen: {
110
+ windows: [{ start: "00:00", end: "14:00", tz: "UTC" }],
111
+ },
112
+ };
113
+ export const DEFAULT_PEAK_HOURS_ENTRY = {
114
+ enabled: true,
115
+ mode: "hard",
116
+ graceActiveSessions: true,
117
+ schedules: DEFAULT_PEAK_HOURS_SCHEDULES,
118
+ };
119
+ // END_BLOCK_PEAK_HOURS_DEFAULTS
83
120
  // START_BLOCK_DEFAULT_CONFIG
84
121
  export function createDefaultPluginToggleConfig() {
85
122
  const config = {};
@@ -163,6 +200,46 @@ export function materializeToolHistoryCompactionEntry(current) {
163
200
  return materialized;
164
201
  }
165
202
  // END_BLOCK_TOOL_HISTORY_MATERIALIZE
203
+ // START_BLOCK_PEAK_HOURS_MATERIALIZE
204
+ function defaultPeakHoursSchedulesCopy() {
205
+ return {
206
+ deepseek: {
207
+ windows: DEFAULT_PEAK_HOURS_SCHEDULES.deepseek.windows.map((window) => ({ ...window })),
208
+ },
209
+ "z-ai": {
210
+ windows: DEFAULT_PEAK_HOURS_SCHEDULES["z-ai"].windows.map((window) => ({ ...window })),
211
+ },
212
+ qwen: {
213
+ windows: DEFAULT_PEAK_HOURS_SCHEDULES.qwen.windows.map((window) => ({ ...window })),
214
+ },
215
+ };
216
+ }
217
+ /**
218
+ * Materialize the peak-hours plugin entry so defaults are always present in
219
+ * vvoc.json. Conservative: user values are never overwritten. Boolean or
220
+ * missing entries expand to the full default entry with the revision-dated
221
+ * schedules; object entries keep their enabled flag, mode, grace flag, and any
222
+ * user-provided schedules object, filling only absent keys with defaults.
223
+ */
224
+ export function materializePeakHoursEntry(current) {
225
+ if (current === undefined || typeof current === "boolean") {
226
+ return {
227
+ enabled: current === undefined ? true : current,
228
+ mode: DEFAULT_PEAK_HOURS_ENTRY.mode,
229
+ graceActiveSessions: DEFAULT_PEAK_HOURS_ENTRY.graceActiveSessions,
230
+ schedules: defaultPeakHoursSchedulesCopy(),
231
+ };
232
+ }
233
+ return {
234
+ enabled: current.enabled ?? true,
235
+ mode: current.mode ?? DEFAULT_PEAK_HOURS_ENTRY.mode,
236
+ graceActiveSessions: current.graceActiveSessions ?? DEFAULT_PEAK_HOURS_ENTRY.graceActiveSessions,
237
+ schedules: isPlainRecord(current.schedules)
238
+ ? current.schedules
239
+ : defaultPeakHoursSchedulesCopy(),
240
+ };
241
+ }
242
+ // END_BLOCK_PEAK_HOURS_MATERIALIZE
166
243
  // START_CONTRACT: isPluginEnabled
167
244
  // PURPOSE: Return whether the named plugin is enabled in an already-loaded vvoc config.
168
245
  // INPUTS: { config: { plugins?: VvocPluginToggleConfig } - loaded vvoc config or compatible plugin toggle holder; pluginName: string - one of PLUGIN_TOGGLE_NAMES }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-toggle-config.js","sourceRoot":"","sources":["../../src/lib/plugin-toggle-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-toggle-config.js","sourceRoot":"","sources":["../../src/lib/plugin-toggle-config.ts"],"names":[],"mappings":"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"}