@icaruk/zai-peak-hours 0.4.0 → 0.6.0

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/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # @icaruk/zai-peak-hours
2
2
 
3
- OpenCode plugin that displays z.ai peak hours information with automatic timezone detection (UTC+8 / Asia/Shanghai).
3
+ OpenCode plugin that displays z.ai peak hours information with automatic timezone detection.
4
4
 
5
5
  ## Features
6
6
 
7
7
  - 🌍 Automatic timezone detection (UTC+8 / Asia/Shanghai)
8
8
  - ⏰ Real-time peak hours status (14:00-18:00 UTC+8)
9
9
  - 📊 Time remaining until next peak/off-peak transition
10
- - 💬 Zero-token slash commands (`/peak_hours`, `/peak_hours_status`) - no LLM invocation
10
+ - 💬 Zero-token slash commands (`/peak_hours`) - no LLM invocation
11
11
 
12
12
  ## Installation
13
13
 
@@ -26,9 +26,8 @@ Restart OpenCode to load the plugin.
26
26
  Commands are automatically available after plugin installation:
27
27
 
28
28
  - `/peak_hours` - Display current peak hours status
29
- - `/peak_hours_status` - Display plugin diagnostics and configuration status
30
29
 
31
- These commands execute locally without invoking LLM (zero token usage) via `command.execute.before` hook.
30
+ This command executes locally without invoking LLM (zero token usage) via `command.execute.before` hook.
32
31
 
33
32
  ## Configuration
34
33
 
package/dist/index.d.ts CHANGED
@@ -1,3 +1,2 @@
1
- import type { Plugin } from '@opencode-ai/plugin';
2
- export declare const PeakHours: Plugin;
1
+ export { PeakHours } from "./plugin.js";
3
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAqFlD,eAAO,MAAM,SAAS,EAAE,MA+EvB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,127 +1,2 @@
1
- import { getPeakHoursStatus, formatPeakHoursMessage } from './utils.js';
2
- import { DEFAULT_CONFIG } from './config.js';
3
- import * as fs from 'node:fs';
4
- import * as path from 'node:path';
5
- // Command-handled sentinel
6
- const COMMAND_HANDLED_SENTINEL = '__PEAK_HOURS_COMMAND_HANDLED__';
7
- function handled() {
8
- throw new Error(COMMAND_HANDLED_SENTINEL);
9
- }
10
- function getConfigPath() {
11
- const configDir = process.env.XDG_CONFIG_HOME
12
- ? path.join(process.env.XDG_CONFIG_HOME, 'opencode')
13
- : path.join(process.env.HOME || process.env.USERPROFILE || '', '.config', 'opencode');
14
- return path.join(configDir, 'peak-hours.json');
15
- }
16
- function loadConfig() {
17
- const configPath = getConfigPath();
18
- if (fs.existsSync(configPath)) {
19
- try {
20
- const configContent = fs.readFileSync(configPath, 'utf-8');
21
- const userConfig = JSON.parse(configContent);
22
- return {
23
- enabled: userConfig.enabled !== undefined ? userConfig.enabled : DEFAULT_CONFIG.enabled,
24
- };
25
- }
26
- catch (error) {
27
- console.error('Error loading peak-hours config:', error);
28
- }
29
- }
30
- return DEFAULT_CONFIG;
31
- }
32
- function renderCommandHeading(title) {
33
- return `${title}\n${'='.repeat(title.length)}`;
34
- }
35
- function renderStatusReport(status, config) {
36
- const currentTime = new Date().toISOString();
37
- const lines = [
38
- renderCommandHeading('Peak Hours Status'),
39
- '',
40
- 'Configuration:',
41
- `- enabled: ${config.enabled}`,
42
- '',
43
- 'Current Status:',
44
- `- current_time: ${currentTime}`,
45
- `- in_peak_hours: ${status.inPeakHours}`,
46
- `- transition: ${status.transitionType}`,
47
- `- time_until_${status.transitionType}: ${status.timeUntilTransition}`,
48
- '',
49
- 'Peak Hours (UTC+8):',
50
- `- start: 14:00`,
51
- `- end: 18:00`,
52
- ];
53
- return lines.join('\n');
54
- }
55
- export const PeakHours = async ({ client }) => {
56
- const config = loadConfig();
57
- const typedClient = client;
58
- async function injectRawOutput(sessionID, output) {
59
- try {
60
- await typedClient.session.prompt({
61
- path: { id: sessionID },
62
- body: {
63
- noReply: true,
64
- parts: [{ type: 'text', text: output, ignored: true }],
65
- },
66
- });
67
- }
68
- catch (err) {
69
- console.error('Failed to inject output:', err);
70
- }
71
- }
72
- async function injectCommandOutputAndHandle(sessionID, output) {
73
- if (output !== undefined && output !== null) {
74
- await injectRawOutput(sessionID, output);
75
- }
76
- handled();
77
- }
78
- async function handlePeakHoursSlashCommand(input) {
79
- if (!config.enabled) {
80
- return await injectCommandOutputAndHandle(input.sessionID, 'Peak Hours plugin is disabled');
81
- }
82
- const status = getPeakHoursStatus();
83
- const output = formatPeakHoursMessage(status);
84
- return await injectCommandOutputAndHandle(input.sessionID, output);
85
- }
86
- async function handlePeakHoursStatusSlashCommand(input) {
87
- if (!config.enabled) {
88
- return await injectCommandOutputAndHandle(input.sessionID, 'Peak Hours plugin is disabled');
89
- }
90
- const status = getPeakHoursStatus();
91
- const output = renderStatusReport(status, config);
92
- return await injectCommandOutputAndHandle(input.sessionID, output);
93
- }
94
- return {
95
- // Register built-in slash commands
96
- config: async (input) => {
97
- const cfg = input;
98
- cfg.command ??= {};
99
- cfg.command['peak_hours'] = {
100
- template: '/peak_hours',
101
- description: 'Display current z.ai peak hours status and time until next transition',
102
- };
103
- cfg.command['peak_hours_status'] = {
104
- template: '/peak_hours_status',
105
- description: 'Display peak hours plugin diagnostics and configuration status',
106
- };
107
- },
108
- // Intercept slash commands and handle them without LLM invocation
109
- 'command.execute.before': async (input) => {
110
- try {
111
- const cmd = input.command;
112
- if (cmd === 'peak_hours') {
113
- return await handlePeakHoursSlashCommand(input);
114
- }
115
- if (cmd === 'peak_hours_status') {
116
- return await handlePeakHoursStatusSlashCommand(input);
117
- }
118
- }
119
- catch (err) {
120
- // IMPORTANT: do not swallow command-handled sentinel errors.
121
- // If this hook resolves, the command proceeds to the LLM.
122
- throw err;
123
- }
124
- },
125
- };
126
- };
1
+ export { PeakHours } from "./plugin.js";
127
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Plugin } from '@opencode-ai/plugin';
2
+ export declare const PeakHours: Plugin;
3
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AA4DlD,eAAO,MAAM,SAAS,EAAE,MA6DvB,CAAC"}
package/dist/plugin.js ADDED
@@ -0,0 +1,89 @@
1
+ import { getPeakHoursStatus, formatPeakHoursMessage } from './utils.js';
2
+ import { DEFAULT_CONFIG } from './config.js';
3
+ import * as fs from 'node:fs';
4
+ import * as path from 'node:path';
5
+ // Command-handled sentinel
6
+ const COMMAND_HANDLED_SENTINEL = '__PEAK_HOURS_COMMAND_HANDLED__';
7
+ function handled() {
8
+ throw new Error(COMMAND_HANDLED_SENTINEL);
9
+ }
10
+ function getConfigPath() {
11
+ const configDir = process.env.XDG_CONFIG_HOME
12
+ ? path.join(process.env.XDG_CONFIG_HOME, 'opencode')
13
+ : path.join(process.env.HOME || process.env.USERPROFILE || '', '.config', 'opencode');
14
+ return path.join(configDir, 'peak-hours.json');
15
+ }
16
+ function loadConfig() {
17
+ const configPath = getConfigPath();
18
+ if (fs.existsSync(configPath)) {
19
+ try {
20
+ const configContent = fs.readFileSync(configPath, 'utf-8');
21
+ const userConfig = JSON.parse(configContent);
22
+ return {
23
+ enabled: userConfig.enabled !== undefined ? userConfig.enabled : DEFAULT_CONFIG.enabled,
24
+ };
25
+ }
26
+ catch (error) {
27
+ console.error('Error loading peak-hours config:', error);
28
+ }
29
+ }
30
+ return DEFAULT_CONFIG;
31
+ }
32
+ export const PeakHours = async ({ client }) => {
33
+ const config = loadConfig();
34
+ const typedClient = client;
35
+ async function injectRawOutput(sessionID, output) {
36
+ try {
37
+ await typedClient.session.prompt({
38
+ path: { id: sessionID },
39
+ body: {
40
+ noReply: true,
41
+ parts: [{ type: 'text', text: output, ignored: true }],
42
+ },
43
+ });
44
+ }
45
+ catch (err) {
46
+ console.error('Failed to inject output:', err);
47
+ }
48
+ }
49
+ async function injectCommandOutputAndHandle(sessionID, output) {
50
+ if (output !== undefined && output !== null) {
51
+ await injectRawOutput(sessionID, output);
52
+ }
53
+ handled();
54
+ }
55
+ async function handlePeakHoursSlashCommand(input) {
56
+ if (!config.enabled) {
57
+ return await injectCommandOutputAndHandle(input.sessionID, 'Peak Hours plugin is disabled');
58
+ }
59
+ const status = getPeakHoursStatus();
60
+ const output = formatPeakHoursMessage(status);
61
+ return await injectCommandOutputAndHandle(input.sessionID, output);
62
+ }
63
+ return {
64
+ // Register built-in slash commands
65
+ config: async (input) => {
66
+ const cfg = input;
67
+ cfg.command ??= {};
68
+ cfg.command['peak_hours'] = {
69
+ template: '/peak_hours',
70
+ description: 'Display current z.ai peak hours status and time until next transition',
71
+ };
72
+ },
73
+ // Intercept slash commands and handle them without LLM invocation
74
+ 'command.execute.before': async (input) => {
75
+ try {
76
+ const cmd = input.command;
77
+ if (cmd === 'peak_hours') {
78
+ return await handlePeakHoursSlashCommand(input);
79
+ }
80
+ }
81
+ catch (err) {
82
+ // IMPORTANT: do not swallow command-handled sentinel errors.
83
+ // If this hook resolves, the command proceeds to the LLM.
84
+ throw err;
85
+ }
86
+ },
87
+ };
88
+ };
89
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,OAAO,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,OAAO,GAAG,KAAK,CAAC;CACjC;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAkDpD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAMtE"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,OAAO,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,OAAO,GAAG,KAAK,CAAC;CACjC;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAkDpD;AA6CD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAQtE"}
package/dist/utils.js CHANGED
@@ -44,12 +44,48 @@ export function getPeakHoursStatus() {
44
44
  transitionType
45
45
  };
46
46
  }
47
- export function formatPeakHoursMessage(status) {
48
- if (status.inPeakHours) {
49
- return `Currently in peak hours. ${status.timeUntilTransition} remaining`;
47
+ function formatGMTOffset(offsetMinutes) {
48
+ const offsetHours = Math.abs(Math.floor(offsetMinutes / 60));
49
+ const offsetMinutesRemainder = Math.abs(offsetMinutes % 60);
50
+ const sign = offsetMinutes <= 0 ? '+' : '-';
51
+ return `GMT${sign}${offsetHours}${offsetMinutesRemainder > 0 ? ':' + String(offsetMinutesRemainder).padStart(2, '0') : ''}`;
52
+ }
53
+ function formatLocalISODate(date) {
54
+ const hours = String(date.getHours()).padStart(2, '0');
55
+ const minutes = String(date.getMinutes()).padStart(2, '0');
56
+ return `${hours}:${minutes}`;
57
+ }
58
+ function convertUTC8ToLocal(utc8Hour, utc8Minute) {
59
+ const now = new Date();
60
+ const offsetMinutes = now.getTimezoneOffset(); // Offset in minutes from UTC (negative for timezones ahead of UTC)
61
+ // UTC+8 time to UTC time
62
+ let utcHour = utc8Hour - 8;
63
+ if (utcHour < 0) {
64
+ utcHour += 24;
50
65
  }
51
- else {
52
- return `Currently in off-peak hours. ${status.timeUntilTransition} remaining`;
66
+ // UTC time to local time
67
+ const totalMinutes = utcHour * 60 + utc8Minute - offsetMinutes;
68
+ let localHour = Math.floor(totalMinutes / 60) % 24;
69
+ if (localHour < 0) {
70
+ localHour += 24;
53
71
  }
72
+ const localMinute = totalMinutes % 60;
73
+ if (localMinute < 0) {
74
+ localMinute + 60;
75
+ }
76
+ return { hour: localHour, minute: Math.abs(localMinute) };
77
+ }
78
+ function formatPeakHoursRange() {
79
+ const start = convertUTC8ToLocal(14, 0);
80
+ const end = convertUTC8ToLocal(18, 0);
81
+ return `${String(start.hour).padStart(2, '0')}:${String(start.minute).padStart(2, '0')} - ${String(end.hour).padStart(2, '0')}:${String(end.minute).padStart(2, '0')}`;
82
+ }
83
+ export function formatPeakHoursMessage(status) {
84
+ const icon = status.inPeakHours ? '🔴' : '✅';
85
+ const peakHoursText = status.inPeakHours ? 'peak' : 'off-peak';
86
+ const offset = formatGMTOffset(new Date().getTimezoneOffset());
87
+ const currentTime = formatLocalISODate(new Date());
88
+ const peakHours = formatPeakHoursRange();
89
+ return `${icon} Currently in ${peakHoursText} hours.\n${status.timeUntilTransition} remaining.\n\nCurrent time: ${currentTime} (${offset})\nPeak hours: ${peakHours} (${offset})`;
54
90
  }
55
91
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,kBAAkB;IAChC,MAAM,cAAc,GAAG,EAAE,CAAC;IAC1B,MAAM,YAAY,GAAG,EAAE,CAAC;IAExB,iDAAiD;IACjD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,iBAAiB,EAAE,GAAG,KAAK,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;IAEzC,IAAI,WAAoB,CAAC;IACzB,IAAI,cAAoB,CAAC;IACzB,IAAI,cAA+B,CAAC;IAEpC,IAAI,WAAW,IAAI,cAAc,IAAI,WAAW,GAAG,YAAY,EAAE,CAAC;QAChE,WAAW,GAAG,IAAI,CAAC;QACnB,cAAc,GAAG,KAAK,CAAC;QACvB,cAAc,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,cAAc,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,KAAK,CAAC;QACpB,cAAc,GAAG,OAAO,CAAC;QAEzB,IAAI,aAAa,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,WAAW,IAAI,YAAY,EAAE,CAAC;YAChC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACrD,CAAC;QAED,aAAa,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,cAAc,GAAG,aAAa,CAAC;IACjC,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAEtE,IAAI,mBAA2B,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAC7B,mBAAmB,GAAG,GAAG,KAAK,UAAU,OAAO,UAAU,CAAC;IAC5D,CAAC;SAAM,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACrB,mBAAmB,GAAG,GAAG,KAAK,QAAQ,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,mBAAmB,GAAG,GAAG,OAAO,UAAU,CAAC;IAC7C,CAAC;IAED,OAAO;QACL,WAAW;QACX,mBAAmB;QACnB,cAAc;KACf,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAuB;IAC5D,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,OAAO,4BAA4B,MAAM,CAAC,mBAAmB,YAAY,CAAC;IAC5E,CAAC;SAAM,CAAC;QACN,OAAO,gCAAgC,MAAM,CAAC,mBAAmB,YAAY,CAAC;IAChF,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@icaruk/zai-peak-hours",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "description": "OpenCode plugin to display z.ai peak hours information with automatic timezone detection",
6
6
  "main": "dist/index.js",