@kenkaiiii/gg-boss 4.3.140 → 4.3.142
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/dist/{chunk-JVQDTPYR.js → chunk-3EWLK53W.js} +18 -9
- package/dist/{chunk-JVQDTPYR.js.map → chunk-3EWLK53W.js.map} +1 -1
- package/dist/{chunk-5WNYQQPQ.js → chunk-QT366Y52.js} +4 -3
- package/dist/{chunk-5WNYQQPQ.js.map → chunk-QT366Y52.js.map} +1 -1
- package/dist/{chunk-PQAHDHVY.js → chunk-WJ4S4TOY.js} +3 -2
- package/dist/{chunk-PQAHDHVY.js.map → chunk-WJ4S4TOY.js.map} +1 -1
- package/dist/{chunk-B2WQ5E5J.js → chunk-YNWFCUMR.js} +2 -1
- package/dist/{chunk-B2WQ5E5J.js.map → chunk-YNWFCUMR.js.map} +1 -1
- package/dist/cli.js +2248 -182
- package/dist/cli.js.map +1 -1
- package/dist/{devtools-VBUDNGEI.js → devtools-4TI4D7F2.js} +3 -2
- package/dist/{devtools-VBUDNGEI.js.map → devtools-4TI4D7F2.js.map} +1 -1
- package/dist/{dist-7DAPKZGX.js → dist-VXOVSHZ5.js} +3 -2
- package/dist/{dist-7DAPKZGX.js.map → dist-VXOVSHZ5.js.map} +1 -1
- package/dist/{ignore-3AEIALHQ.js → ignore-76P4EAAU.js} +3 -2
- package/dist/{ignore-3AEIALHQ.js.map → ignore-76P4EAAU.js.map} +1 -1
- package/dist/index.js +21 -4
- package/dist/index.js.map +1 -1
- package/dist/{out-D65DTPFZ.js → out-XEXARMKS.js} +3 -2
- package/dist/{out-D65DTPFZ.js.map → out-XEXARMKS.js.map} +1 -1
- package/dist/pixel-WPYTQADG.js +14 -0
- package/dist/{pixel-fix-ALWXCLTS.js → pixel-fix-4WGZAJ5W.js} +4 -3
- package/dist/{pixel-fix-ALWXCLTS.js.map → pixel-fix-4WGZAJ5W.js.map} +1 -1
- package/package.json +10 -11
- package/dist/audio.d.ts +0 -21
- package/dist/audio.d.ts.map +0 -1
- package/dist/audio.js +0 -231
- package/dist/audio.js.map +0 -1
- package/dist/audio.test.d.ts +0 -2
- package/dist/audio.test.d.ts.map +0 -1
- package/dist/audio.test.js +0 -13
- package/dist/audio.test.js.map +0 -1
- package/dist/auto-update.d.ts +0 -24
- package/dist/auto-update.d.ts.map +0 -1
- package/dist/auto-update.js +0 -231
- package/dist/auto-update.js.map +0 -1
- package/dist/banner.d.ts +0 -17
- package/dist/banner.d.ts.map +0 -1
- package/dist/banner.js +0 -25
- package/dist/banner.js.map +0 -1
- package/dist/boss-footer.d.ts +0 -25
- package/dist/boss-footer.d.ts.map +0 -1
- package/dist/boss-footer.js +0 -107
- package/dist/boss-footer.js.map +0 -1
- package/dist/boss-phrases.d.ts +0 -9
- package/dist/boss-phrases.d.ts.map +0 -1
- package/dist/boss-phrases.js +0 -71
- package/dist/boss-phrases.js.map +0 -1
- package/dist/boss-store.d.ts +0 -245
- package/dist/boss-store.d.ts.map +0 -1
- package/dist/boss-store.js +0 -623
- package/dist/boss-store.js.map +0 -1
- package/dist/boss-system-prompt.d.ts +0 -3
- package/dist/boss-system-prompt.d.ts.map +0 -1
- package/dist/boss-system-prompt.js +0 -180
- package/dist/boss-system-prompt.js.map +0 -1
- package/dist/boss-tasks-overlay.d.ts +0 -22
- package/dist/boss-tasks-overlay.d.ts.map +0 -1
- package/dist/boss-tasks-overlay.js +0 -157
- package/dist/boss-tasks-overlay.js.map +0 -1
- package/dist/branding.d.ts +0 -32
- package/dist/branding.d.ts.map +0 -1
- package/dist/branding.js +0 -59
- package/dist/branding.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.smoke.test.d.ts +0 -2
- package/dist/cli.smoke.test.d.ts.map +0 -1
- package/dist/cli.smoke.test.js +0 -48
- package/dist/cli.smoke.test.js.map +0 -1
- package/dist/colors.d.ts +0 -14
- package/dist/colors.d.ts.map +0 -1
- package/dist/colors.js +0 -31
- package/dist/colors.js.map +0 -1
- package/dist/discover.d.ts +0 -13
- package/dist/discover.d.ts.map +0 -1
- package/dist/discover.js +0 -92
- package/dist/discover.js.map +0 -1
- package/dist/event-queue.d.ts +0 -16
- package/dist/event-queue.d.ts.map +0 -1
- package/dist/event-queue.js +0 -39
- package/dist/event-queue.js.map +0 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +0 -1
- package/dist/link-command.d.ts +0 -2
- package/dist/link-command.d.ts.map +0 -1
- package/dist/link-command.js +0 -120
- package/dist/link-command.js.map +0 -1
- package/dist/links.d.ts +0 -11
- package/dist/links.d.ts.map +0 -1
- package/dist/links.js +0 -22
- package/dist/links.js.map +0 -1
- package/dist/logger.d.ts +0 -41
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -112
- package/dist/logger.js.map +0 -1
- package/dist/orchestrator-app.d.ts +0 -15
- package/dist/orchestrator-app.d.ts.map +0 -1
- package/dist/orchestrator-app.js +0 -599
- package/dist/orchestrator-app.js.map +0 -1
- package/dist/orchestrator.d.ts +0 -147
- package/dist/orchestrator.d.ts.map +0 -1
- package/dist/orchestrator.js +0 -707
- package/dist/orchestrator.js.map +0 -1
- package/dist/orchestrator.test.d.ts +0 -2
- package/dist/orchestrator.test.d.ts.map +0 -1
- package/dist/orchestrator.test.js +0 -55
- package/dist/orchestrator.test.js.map +0 -1
- package/dist/pixel-WB6VRJWP.js +0 -13
- package/dist/radio-picker.d.ts +0 -20
- package/dist/radio-picker.d.ts.map +0 -1
- package/dist/radio-picker.js +0 -31
- package/dist/radio-picker.js.map +0 -1
- package/dist/radio.d.ts +0 -43
- package/dist/radio.d.ts.map +0 -1
- package/dist/radio.js +0 -150
- package/dist/radio.js.map +0 -1
- package/dist/sessions.d.ts +0 -21
- package/dist/sessions.d.ts.map +0 -1
- package/dist/sessions.js +0 -122
- package/dist/sessions.js.map +0 -1
- package/dist/settings.d.ts +0 -11
- package/dist/settings.d.ts.map +0 -1
- package/dist/settings.js +0 -38
- package/dist/settings.js.map +0 -1
- package/dist/slash-commands.d.ts +0 -19
- package/dist/slash-commands.d.ts.map +0 -1
- package/dist/slash-commands.js +0 -76
- package/dist/slash-commands.js.map +0 -1
- package/dist/splash.d.ts +0 -21
- package/dist/splash.d.ts.map +0 -1
- package/dist/splash.js +0 -137
- package/dist/splash.js.map +0 -1
- package/dist/task-tools.d.ts +0 -18
- package/dist/task-tools.d.ts.map +0 -1
- package/dist/task-tools.js +0 -172
- package/dist/task-tools.js.map +0 -1
- package/dist/tasks-store.d.ts +0 -66
- package/dist/tasks-store.d.ts.map +0 -1
- package/dist/tasks-store.js +0 -199
- package/dist/tasks-store.js.map +0 -1
- package/dist/tasks-store.test.d.ts +0 -2
- package/dist/tasks-store.test.d.ts.map +0 -1
- package/dist/tasks-store.test.js +0 -138
- package/dist/tasks-store.test.js.map +0 -1
- package/dist/tool-formatters.d.ts +0 -7
- package/dist/tool-formatters.d.ts.map +0 -1
- package/dist/tool-formatters.js +0 -111
- package/dist/tool-formatters.js.map +0 -1
- package/dist/tools.d.ts +0 -26
- package/dist/tools.d.ts.map +0 -1
- package/dist/tools.js +0 -133
- package/dist/tools.js.map +0 -1
- package/dist/types.d.ts +0 -32
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/worker.d.ts +0 -47
- package/dist/worker.d.ts.map +0 -1
- package/dist/worker.js +0 -123
- package/dist/worker.js.map +0 -1
- /package/dist/{pixel-WB6VRJWP.js.map → pixel-WPYTQADG.js.map} +0 -0
package/dist/audio.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Duration of the bundled splash audio, in milliseconds. Read once from the
|
|
3
|
-
* actual file so swapping the asset Just Works without anyone having to
|
|
4
|
-
* remember to bump a constant. Falls back to 1500ms if parsing fails.
|
|
5
|
-
*/
|
|
6
|
-
export declare function getSplashAudioDurationMs(): number;
|
|
7
|
-
export declare function playSplashAudio(): Promise<void>;
|
|
8
|
-
/**
|
|
9
|
-
* Play the worker-completion ping. Fires on every `worker_turn_complete`
|
|
10
|
-
* event so the user gets an audio cue when they're not looking at the
|
|
11
|
-
* terminal. Fire-and-forget — multiple completions can layer.
|
|
12
|
-
*/
|
|
13
|
-
export declare function playDoneAudio(): Promise<void>;
|
|
14
|
-
/**
|
|
15
|
-
* Play the all-clear chime. Fires once when the orchestrator transitions
|
|
16
|
-
* from "had worker activity" to "all idle, nothing in queue, awaiting next
|
|
17
|
-
* instruction". Distinct from done.mp3 (per-worker completion) — this is
|
|
18
|
-
* the "everything's wrapped up" signal you want to hear from another room.
|
|
19
|
-
*/
|
|
20
|
-
export declare function playReadyAudio(): Promise<void>;
|
|
21
|
-
//# sourceMappingURL=audio.d.ts.map
|
package/dist/audio.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"AAsFA;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAGjD;AAuHD,wBAAgB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAE9C"}
|
package/dist/audio.js
DELETED
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
|
-
import { fileURLToPath } from "node:url";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import fs from "node:fs";
|
|
5
|
-
/**
|
|
6
|
-
* Parse an MP3's duration in milliseconds by walking its frame headers. Pure
|
|
7
|
-
* JS, no native deps. Handles CBR (sums frame sizes vs sample rate) and VBR
|
|
8
|
-
* with a Xing/Info header (reads totalFrames directly). Returns null on any
|
|
9
|
-
* parse failure — caller falls back to a sensible default in that case.
|
|
10
|
-
*
|
|
11
|
-
* Why we do this at runtime: the splash needs to stay visible for the full
|
|
12
|
-
* audio duration so the user isn't dumped into the chat mid-jingle. Bundling
|
|
13
|
-
* a hardcoded constant works until someone swaps the asset and forgets to
|
|
14
|
-
* update the number; reading it from the file is robust to that.
|
|
15
|
-
*/
|
|
16
|
-
function readMp3DurationMs(file) {
|
|
17
|
-
try {
|
|
18
|
-
const buf = fs.readFileSync(file);
|
|
19
|
-
// Skip ID3v2 tag if present — first 10 bytes are "ID3" + version + flags
|
|
20
|
-
// + size (synchsafe). Frame headers start after the tag.
|
|
21
|
-
let i = 0;
|
|
22
|
-
if (buf.length >= 10 && buf[0] === 0x49 && buf[1] === 0x44 && buf[2] === 0x33) {
|
|
23
|
-
const tagSize = ((buf[6] & 0x7f) << 21) |
|
|
24
|
-
((buf[7] & 0x7f) << 14) |
|
|
25
|
-
((buf[8] & 0x7f) << 7) |
|
|
26
|
-
(buf[9] & 0x7f);
|
|
27
|
-
i = 10 + tagSize;
|
|
28
|
-
}
|
|
29
|
-
// Find first MPEG audio sync (11 bits set: 0xFFE).
|
|
30
|
-
while (i + 4 < buf.length) {
|
|
31
|
-
if (buf[i] === 0xff && (buf[i + 1] & 0xe0) === 0xe0)
|
|
32
|
-
break;
|
|
33
|
-
i++;
|
|
34
|
-
}
|
|
35
|
-
if (i + 4 >= buf.length)
|
|
36
|
-
return null;
|
|
37
|
-
const h1 = buf[i + 1];
|
|
38
|
-
const h2 = buf[i + 2];
|
|
39
|
-
const versionBits = (h1 >> 3) & 0x03; // 11 = MPEG-1, 10 = MPEG-2, 00 = MPEG-2.5
|
|
40
|
-
const layerBits = (h1 >> 1) & 0x03; // 01 = Layer III
|
|
41
|
-
const bitrateIdx = (h2 >> 4) & 0x0f;
|
|
42
|
-
const sampleRateIdx = (h2 >> 2) & 0x03;
|
|
43
|
-
const padding = (h2 >> 1) & 0x01;
|
|
44
|
-
const isMpeg1 = versionBits === 0x03;
|
|
45
|
-
if (layerBits !== 0x01)
|
|
46
|
-
return null; // only Layer III is bundled
|
|
47
|
-
// Bitrate kbps tables for MPEG-1/2 Layer III
|
|
48
|
-
const BR_V1 = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1];
|
|
49
|
-
const BR_V2 = [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1];
|
|
50
|
-
const SR_V1 = [44100, 48000, 32000, -1];
|
|
51
|
-
const SR_V2 = [22050, 24000, 16000, -1];
|
|
52
|
-
const SR_V25 = [11025, 12000, 8000, -1];
|
|
53
|
-
const bitrate = (isMpeg1 ? BR_V1 : BR_V2)[bitrateIdx];
|
|
54
|
-
const sampleRate = (isMpeg1 ? SR_V1 : versionBits === 0x02 ? SR_V2 : SR_V25)[sampleRateIdx];
|
|
55
|
-
if (!bitrate || bitrate <= 0 || !sampleRate || sampleRate <= 0)
|
|
56
|
-
return null;
|
|
57
|
-
const samplesPerFrame = isMpeg1 ? 1152 : 576;
|
|
58
|
-
// Look for a Xing/Info header inside the first frame (offset depends on
|
|
59
|
-
// channel mode). If present, totalFrames * samplesPerFrame / sampleRate
|
|
60
|
-
// gives an accurate VBR duration.
|
|
61
|
-
const sideInfoOffset = isMpeg1 ? (((h2 >> 6) & 0x03) === 0x03 ? 17 : 32) : 9;
|
|
62
|
-
const xingTagOffset = i + 4 + sideInfoOffset;
|
|
63
|
-
if (xingTagOffset + 8 < buf.length) {
|
|
64
|
-
const tag = buf.toString("ascii", xingTagOffset, xingTagOffset + 4);
|
|
65
|
-
if (tag === "Xing" || tag === "Info") {
|
|
66
|
-
const flags = buf.readUInt32BE(xingTagOffset + 4);
|
|
67
|
-
if (flags & 0x01) {
|
|
68
|
-
// totalFrames is the next 32-bit BE
|
|
69
|
-
const totalFrames = buf.readUInt32BE(xingTagOffset + 8);
|
|
70
|
-
if (totalFrames > 0) {
|
|
71
|
-
return Math.round((totalFrames * samplesPerFrame * 1000) / sampleRate);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// CBR fallback: bytes / (bitrate*1000/8) → seconds.
|
|
77
|
-
const audioBytes = buf.length - i;
|
|
78
|
-
const seconds = audioBytes / ((bitrate * 1000) / 8);
|
|
79
|
-
if (!Number.isFinite(seconds) || seconds <= 0)
|
|
80
|
-
return null;
|
|
81
|
-
void padding; // padding affects per-frame size, immaterial at file scale
|
|
82
|
-
return Math.round(seconds * 1000);
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Duration of the bundled splash audio, in milliseconds. Read once from the
|
|
90
|
-
* actual file so swapping the asset Just Works without anyone having to
|
|
91
|
-
* remember to bump a constant. Falls back to 1500ms if parsing fails.
|
|
92
|
-
*/
|
|
93
|
-
export function getSplashAudioDurationMs() {
|
|
94
|
-
const ms = readMp3DurationMs(splashAssetPath());
|
|
95
|
-
return ms && ms > 0 ? ms : 1500;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Resolve a bundled audio file by name. The build script copies everything
|
|
99
|
-
* under `assets/` into `dist/` so the file lands inside the published tarball
|
|
100
|
-
* when users `npm i -g`. Falls back to the source location during local dev
|
|
101
|
-
* where dist hasn't been populated yet.
|
|
102
|
-
*/
|
|
103
|
-
function assetPath(name) {
|
|
104
|
-
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
105
|
-
const dist = path.join(here, name);
|
|
106
|
-
if (fs.existsSync(dist))
|
|
107
|
-
return dist;
|
|
108
|
-
return path.join(here, "..", "assets", name);
|
|
109
|
-
}
|
|
110
|
-
function splashAssetPath() {
|
|
111
|
-
return assetPath("splash.mp3");
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Fire a candidate player as a detached child. Returns true if the spawn
|
|
115
|
-
* actually started successfully (no immediate ENOENT). The audio process
|
|
116
|
-
* outlives the splash unmount so playback can finish on its own. Stdio is
|
|
117
|
-
* redirected to /dev/null so the player can't pollute the TUI.
|
|
118
|
-
*/
|
|
119
|
-
function trySpawn(cmd, args) {
|
|
120
|
-
return new Promise((resolve) => {
|
|
121
|
-
let resolved = false;
|
|
122
|
-
try {
|
|
123
|
-
const child = spawn(cmd, args, {
|
|
124
|
-
detached: true,
|
|
125
|
-
stdio: "ignore",
|
|
126
|
-
});
|
|
127
|
-
child.once("error", () => {
|
|
128
|
-
// ENOENT (binary not installed) or permission failure — let the next
|
|
129
|
-
// candidate take a turn. Don't surface to the user.
|
|
130
|
-
if (!resolved) {
|
|
131
|
-
resolved = true;
|
|
132
|
-
resolve(false);
|
|
133
|
-
}
|
|
134
|
-
});
|
|
135
|
-
child.once("spawn", () => {
|
|
136
|
-
if (!resolved) {
|
|
137
|
-
resolved = true;
|
|
138
|
-
// Detach so the parent process exiting doesn't kill the audio.
|
|
139
|
-
child.unref();
|
|
140
|
-
resolve(true);
|
|
141
|
-
}
|
|
142
|
-
});
|
|
143
|
-
// Some Node versions fire neither immediately. After 50ms with no error,
|
|
144
|
-
// assume success — the spawn went through.
|
|
145
|
-
setTimeout(() => {
|
|
146
|
-
if (!resolved) {
|
|
147
|
-
resolved = true;
|
|
148
|
-
child.unref();
|
|
149
|
-
resolve(true);
|
|
150
|
-
}
|
|
151
|
-
}, 50);
|
|
152
|
-
}
|
|
153
|
-
catch {
|
|
154
|
-
resolve(false);
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Cross-platform fire-and-forget MP3 playback. Tries the most likely binary
|
|
160
|
-
* for the host OS first, then a small chain of common Linux fallbacks.
|
|
161
|
-
*
|
|
162
|
-
* Platform notes:
|
|
163
|
-
* - macOS: `afplay` ships with the OS, always works for MP3.
|
|
164
|
-
* - Windows: PowerShell + WPF MediaPlayer is built-in and supports MP3 via
|
|
165
|
-
* DirectShow / MediaFoundation. Doesn't pop up a window because
|
|
166
|
-
* the script runs sync inside powershell.exe with -NoProfile.
|
|
167
|
-
* - Linux: No single guaranteed binary. Try mpv → ffplay → mpg123 → cvlc.
|
|
168
|
-
* If none are installed, give up silently — Linux desktop audio
|
|
169
|
-
* is fragmented enough that we don't want to bloat the package
|
|
170
|
-
* with a bundled player.
|
|
171
|
-
*/
|
|
172
|
-
async function playFile(file) {
|
|
173
|
-
if (!fs.existsSync(file))
|
|
174
|
-
return;
|
|
175
|
-
const platform = process.platform;
|
|
176
|
-
if (platform === "darwin") {
|
|
177
|
-
await trySpawn("afplay", [file]);
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
if (platform === "win32") {
|
|
181
|
-
// Escape single quotes in the path for the PowerShell -Command argument.
|
|
182
|
-
const safe = file.replace(/'/g, "''");
|
|
183
|
-
const script = [
|
|
184
|
-
"Add-Type -AssemblyName presentationCore;",
|
|
185
|
-
"$p = New-Object System.Windows.Media.MediaPlayer;",
|
|
186
|
-
`$p.Open([uri]'${safe}');`,
|
|
187
|
-
"$p.Play();",
|
|
188
|
-
// Sleep so the powershell process stays alive long enough to actually
|
|
189
|
-
// play the clip (MediaPlayer is async; if powershell exits the GC
|
|
190
|
-
// tears the player down before sound plays). Match clip length + a beat.
|
|
191
|
-
"Start-Sleep -Seconds 5;",
|
|
192
|
-
].join(" ");
|
|
193
|
-
await trySpawn("powershell.exe", ["-NoProfile", "-WindowStyle", "Hidden", "-Command", script]);
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
// Linux + everything else: walk the candidates.
|
|
197
|
-
const linuxCandidates = [
|
|
198
|
-
{ cmd: "mpv", args: ["--really-quiet", "--no-video", file] },
|
|
199
|
-
{ cmd: "ffplay", args: ["-nodisp", "-autoexit", "-loglevel", "quiet", file] },
|
|
200
|
-
{ cmd: "mpg123", args: ["-q", file] },
|
|
201
|
-
{ cmd: "mpg321", args: ["-q", file] },
|
|
202
|
-
{ cmd: "cvlc", args: ["--play-and-exit", "--quiet", file] },
|
|
203
|
-
{ cmd: "paplay", args: [file] },
|
|
204
|
-
];
|
|
205
|
-
for (const c of linuxCandidates) {
|
|
206
|
-
const ok = await trySpawn(c.cmd, c.args);
|
|
207
|
-
if (ok)
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
export function playSplashAudio() {
|
|
212
|
-
return playFile(splashAssetPath());
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Play the worker-completion ping. Fires on every `worker_turn_complete`
|
|
216
|
-
* event so the user gets an audio cue when they're not looking at the
|
|
217
|
-
* terminal. Fire-and-forget — multiple completions can layer.
|
|
218
|
-
*/
|
|
219
|
-
export function playDoneAudio() {
|
|
220
|
-
return playFile(assetPath("done.mp3"));
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Play the all-clear chime. Fires once when the orchestrator transitions
|
|
224
|
-
* from "had worker activity" to "all idle, nothing in queue, awaiting next
|
|
225
|
-
* instruction". Distinct from done.mp3 (per-worker completion) — this is
|
|
226
|
-
* the "everything's wrapped up" signal you want to hear from another room.
|
|
227
|
-
*/
|
|
228
|
-
export function playReadyAudio() {
|
|
229
|
-
return playFile(assetPath("ready.mp3"));
|
|
230
|
-
}
|
|
231
|
-
//# sourceMappingURL=audio.js.map
|
package/dist/audio.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"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"}
|
package/dist/audio.test.d.ts
DELETED
package/dist/audio.test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"audio.test.d.ts","sourceRoot":"","sources":["../src/audio.test.ts"],"names":[],"mappings":""}
|
package/dist/audio.test.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { getSplashAudioDurationMs } from "./audio.js";
|
|
3
|
-
describe("getSplashAudioDurationMs", () => {
|
|
4
|
-
it("reads the bundled splash.mp3 within an expected range", () => {
|
|
5
|
-
// The current asset is ~1.44s. Allow generous slack so swapping the
|
|
6
|
-
// asset doesn't break the test — we're really just asserting that the
|
|
7
|
-
// parser produces a sensible non-fallback value (not the 1500ms default).
|
|
8
|
-
const ms = getSplashAudioDurationMs();
|
|
9
|
-
expect(ms).toBeGreaterThan(500);
|
|
10
|
-
expect(ms).toBeLessThan(10000);
|
|
11
|
-
});
|
|
12
|
-
});
|
|
13
|
-
//# sourceMappingURL=audio.test.js.map
|
package/dist/audio.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"audio.test.js","sourceRoot":"","sources":["../src/audio.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEtD,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,oEAAoE;QACpE,sEAAsE;QACtE,0EAA0E;QAC1E,MAAM,EAAE,GAAG,wBAAwB,EAAE,CAAC;QACtC,MAAM,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/auto-update.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Called on CLI startup. If the previous run flagged a newer version, kicks
|
|
3
|
-
* off `npm i -g` in the background and returns a one-line "installing…"
|
|
4
|
-
* message for the caller to print. Always also schedules a fresh registry
|
|
5
|
-
* check (rate-limited) so the next startup has up-to-date info.
|
|
6
|
-
*/
|
|
7
|
-
export declare function checkAndAutoUpdate(currentVersion: string): string | null;
|
|
8
|
-
/**
|
|
9
|
-
* Synchronous TUI getter — reads the state file and returns the pending
|
|
10
|
-
* update info (if any). Drives the "✨ Update ready" indicator in the
|
|
11
|
-
* worker bar so users know to restart.
|
|
12
|
-
*/
|
|
13
|
-
export declare function getPendingUpdate(currentVersion: string): {
|
|
14
|
-
latestVersion: string;
|
|
15
|
-
} | null;
|
|
16
|
-
/**
|
|
17
|
-
* Start a long-running session timer that pings npm hourly. If a newer
|
|
18
|
-
* version is found, calls `onUpdate(message)` with a friendly notification
|
|
19
|
-
* and stops further checks (no point pinging again — restart is needed).
|
|
20
|
-
* The timer is unref'd so it doesn't keep the process alive on its own.
|
|
21
|
-
*/
|
|
22
|
-
export declare function startPeriodicUpdateCheck(currentVersion: string, onUpdate: (message: string) => void): void;
|
|
23
|
-
export declare function stopPeriodicUpdateCheck(): void;
|
|
24
|
-
//# sourceMappingURL=auto-update.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"AAmIA;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiCxE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASzF;AAwBD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAClC,IAAI,CAwBN;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAK9C"}
|
package/dist/auto-update.js
DELETED
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
|
-
import fs from "node:fs";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import os from "node:os";
|
|
5
|
-
/**
|
|
6
|
-
* gg-boss auto-update — mirrors ggcoder's pattern (packages/ggcoder/src/core/
|
|
7
|
-
* auto-update.ts) but pinned to @kenkaiiii/gg-boss and with its own state
|
|
8
|
-
* file under ~/.gg/boss/ so it can't fight with ggcoder's checker.
|
|
9
|
-
*
|
|
10
|
-
* Two-phase strategy:
|
|
11
|
-
* - Phase 1 (instant, blocking): if a previous run found a newer version,
|
|
12
|
-
* spawn `npm i -g @kenkaiiii/gg-boss@latest` (or pnpm/yarn equivalent)
|
|
13
|
-
* in a detached child. Takes effect on the user's NEXT launch.
|
|
14
|
-
* - Phase 2 (async, non-blocking): hit the npm registry to compare versions
|
|
15
|
-
* so the next startup knows if there's anything to install. Throttled to
|
|
16
|
-
* once an hour per state-file timestamp.
|
|
17
|
-
*
|
|
18
|
-
* Plus a periodic in-session check so a user who never restarts still gets
|
|
19
|
-
* notified when a new version drops.
|
|
20
|
-
*/
|
|
21
|
-
const PACKAGE_NAME = "@kenkaiiii/gg-boss";
|
|
22
|
-
const REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
|
|
23
|
-
const CHECK_INTERVAL_MS = 60 * 60 * 1000; // 1 hour
|
|
24
|
-
const FETCH_TIMEOUT_MS = 10_000;
|
|
25
|
-
var PackageManager;
|
|
26
|
-
(function (PackageManager) {
|
|
27
|
-
PackageManager["NPM"] = "npm";
|
|
28
|
-
PackageManager["PNPM"] = "pnpm";
|
|
29
|
-
PackageManager["YARN"] = "yarn";
|
|
30
|
-
PackageManager["UNKNOWN"] = "unknown";
|
|
31
|
-
})(PackageManager || (PackageManager = {}));
|
|
32
|
-
function getStateFilePath() {
|
|
33
|
-
return path.join(os.homedir(), ".gg", "boss", "update-state.json");
|
|
34
|
-
}
|
|
35
|
-
function readState() {
|
|
36
|
-
try {
|
|
37
|
-
const raw = fs.readFileSync(getStateFilePath(), "utf-8");
|
|
38
|
-
return JSON.parse(raw);
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
function writeState(state) {
|
|
45
|
-
try {
|
|
46
|
-
const dir = path.dirname(getStateFilePath());
|
|
47
|
-
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
48
|
-
fs.writeFileSync(getStateFilePath(), JSON.stringify(state));
|
|
49
|
-
}
|
|
50
|
-
catch {
|
|
51
|
-
// Non-fatal — we'll just retry next launch.
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
function compareVersions(a, b) {
|
|
55
|
-
const pa = a.split(".").map(Number);
|
|
56
|
-
const pb = b.split(".").map(Number);
|
|
57
|
-
for (let i = 0; i < 3; i++) {
|
|
58
|
-
const diff = (pa[i] ?? 0) - (pb[i] ?? 0);
|
|
59
|
-
if (diff !== 0)
|
|
60
|
-
return diff;
|
|
61
|
-
}
|
|
62
|
-
return 0;
|
|
63
|
-
}
|
|
64
|
-
function detectInstallInfo() {
|
|
65
|
-
const scriptPath = (process.argv[1] ?? "").replace(/\\/g, "/");
|
|
66
|
-
// npx invocations are ephemeral — never auto-update.
|
|
67
|
-
if (scriptPath.includes("/_npx/")) {
|
|
68
|
-
return { packageManager: PackageManager.UNKNOWN, updateCommand: null };
|
|
69
|
-
}
|
|
70
|
-
if (scriptPath.includes("/.pnpm") || scriptPath.includes("/pnpm/global")) {
|
|
71
|
-
return {
|
|
72
|
-
packageManager: PackageManager.PNPM,
|
|
73
|
-
updateCommand: `pnpm add -g ${PACKAGE_NAME}@latest`,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
if (scriptPath.includes("/.yarn/") || scriptPath.includes("/yarn/global")) {
|
|
77
|
-
return {
|
|
78
|
-
packageManager: PackageManager.YARN,
|
|
79
|
-
updateCommand: `yarn global add ${PACKAGE_NAME}@latest`,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
return {
|
|
83
|
-
packageManager: PackageManager.NPM,
|
|
84
|
-
updateCommand: `npm install -g ${PACKAGE_NAME}@latest`,
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
async function fetchLatestVersion() {
|
|
88
|
-
try {
|
|
89
|
-
const controller = new AbortController();
|
|
90
|
-
const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
91
|
-
const response = await fetch(REGISTRY_URL, { signal: controller.signal });
|
|
92
|
-
clearTimeout(timeout);
|
|
93
|
-
const data = (await response.json());
|
|
94
|
-
const version = data.version?.trim();
|
|
95
|
-
return version && /^\d+\.\d+\.\d+/.test(version) ? version : null;
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
function performUpdateInBackground(command) {
|
|
102
|
-
try {
|
|
103
|
-
const parts = command.split(" ");
|
|
104
|
-
const child = spawn(parts[0], parts.slice(1), {
|
|
105
|
-
detached: true,
|
|
106
|
-
stdio: "ignore",
|
|
107
|
-
env: { ...process.env, npm_config_loglevel: "silent" },
|
|
108
|
-
});
|
|
109
|
-
child.unref();
|
|
110
|
-
}
|
|
111
|
-
catch {
|
|
112
|
-
// Non-fatal — the next launch will try again.
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Called on CLI startup. If the previous run flagged a newer version, kicks
|
|
117
|
-
* off `npm i -g` in the background and returns a one-line "installing…"
|
|
118
|
-
* message for the caller to print. Always also schedules a fresh registry
|
|
119
|
-
* check (rate-limited) so the next startup has up-to-date info.
|
|
120
|
-
*/
|
|
121
|
-
export function checkAndAutoUpdate(currentVersion) {
|
|
122
|
-
try {
|
|
123
|
-
const state = readState();
|
|
124
|
-
let message = null;
|
|
125
|
-
// Phase 1: install if a previous check found something newer.
|
|
126
|
-
if (state?.updatePending && state.latestVersion) {
|
|
127
|
-
if (compareVersions(state.latestVersion, currentVersion) > 0) {
|
|
128
|
-
const info = detectInstallInfo();
|
|
129
|
-
if (info.updateCommand) {
|
|
130
|
-
performUpdateInBackground(info.updateCommand);
|
|
131
|
-
message = `Ken just shipped ${state.latestVersion}! Installing in the background — takes effect next launch.`;
|
|
132
|
-
writeState({
|
|
133
|
-
...state,
|
|
134
|
-
lastCheckedAt: Date.now(),
|
|
135
|
-
updatePending: false,
|
|
136
|
-
lastUpdateAttempt: Date.now(),
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
141
|
-
// Already on latest (user updated manually) — clear the pending flag.
|
|
142
|
-
writeState({ ...state, updatePending: false });
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
// Phase 2: schedule a fresh check, throttled.
|
|
146
|
-
const shouldCheck = !state || Date.now() - state.lastCheckedAt > CHECK_INTERVAL_MS;
|
|
147
|
-
if (shouldCheck)
|
|
148
|
-
scheduleBackgroundCheck(currentVersion);
|
|
149
|
-
return message;
|
|
150
|
-
}
|
|
151
|
-
catch {
|
|
152
|
-
return null;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Synchronous TUI getter — reads the state file and returns the pending
|
|
157
|
-
* update info (if any). Drives the "✨ Update ready" indicator in the
|
|
158
|
-
* worker bar so users know to restart.
|
|
159
|
-
*/
|
|
160
|
-
export function getPendingUpdate(currentVersion) {
|
|
161
|
-
try {
|
|
162
|
-
const state = readState();
|
|
163
|
-
if (!state?.latestVersion)
|
|
164
|
-
return null;
|
|
165
|
-
if (compareVersions(state.latestVersion, currentVersion) <= 0)
|
|
166
|
-
return null;
|
|
167
|
-
return { latestVersion: state.latestVersion };
|
|
168
|
-
}
|
|
169
|
-
catch {
|
|
170
|
-
return null;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
function scheduleBackgroundCheck(currentVersion) {
|
|
174
|
-
fetchLatestVersion()
|
|
175
|
-
.then((latestVersion) => {
|
|
176
|
-
const newState = {
|
|
177
|
-
lastCheckedAt: Date.now(),
|
|
178
|
-
latestVersion: latestVersion ?? undefined,
|
|
179
|
-
updatePending: false,
|
|
180
|
-
};
|
|
181
|
-
if (latestVersion && compareVersions(latestVersion, currentVersion) > 0) {
|
|
182
|
-
newState.updatePending = true;
|
|
183
|
-
}
|
|
184
|
-
writeState(newState);
|
|
185
|
-
})
|
|
186
|
-
.catch(() => {
|
|
187
|
-
// Non-fatal — we'll try again next launch.
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
// ── In-session periodic check ──────────────────────────────
|
|
191
|
-
let periodicTimer = null;
|
|
192
|
-
/**
|
|
193
|
-
* Start a long-running session timer that pings npm hourly. If a newer
|
|
194
|
-
* version is found, calls `onUpdate(message)` with a friendly notification
|
|
195
|
-
* and stops further checks (no point pinging again — restart is needed).
|
|
196
|
-
* The timer is unref'd so it doesn't keep the process alive on its own.
|
|
197
|
-
*/
|
|
198
|
-
export function startPeriodicUpdateCheck(currentVersion, onUpdate) {
|
|
199
|
-
if (periodicTimer)
|
|
200
|
-
return;
|
|
201
|
-
periodicTimer = setInterval(() => {
|
|
202
|
-
fetchLatestVersion()
|
|
203
|
-
.then((latestVersion) => {
|
|
204
|
-
if (!latestVersion)
|
|
205
|
-
return;
|
|
206
|
-
if (compareVersions(latestVersion, currentVersion) <= 0)
|
|
207
|
-
return;
|
|
208
|
-
const info = detectInstallInfo();
|
|
209
|
-
if (!info.updateCommand)
|
|
210
|
-
return;
|
|
211
|
-
writeState({
|
|
212
|
-
lastCheckedAt: Date.now(),
|
|
213
|
-
latestVersion,
|
|
214
|
-
updatePending: true,
|
|
215
|
-
});
|
|
216
|
-
onUpdate(`Ken just pushed a fresh update — ${currentVersion} → ${latestVersion}! Restart ggboss to grab it (or run ${info.updateCommand} if you can't wait).`);
|
|
217
|
-
stopPeriodicUpdateCheck();
|
|
218
|
-
})
|
|
219
|
-
.catch(() => {
|
|
220
|
-
// Non-fatal.
|
|
221
|
-
});
|
|
222
|
-
}, CHECK_INTERVAL_MS);
|
|
223
|
-
periodicTimer.unref();
|
|
224
|
-
}
|
|
225
|
-
export function stopPeriodicUpdateCheck() {
|
|
226
|
-
if (periodicTimer) {
|
|
227
|
-
clearInterval(periodicTimer);
|
|
228
|
-
periodicTimer = null;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
//# sourceMappingURL=auto-update.js.map
|
package/dist/auto-update.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"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"}
|
package/dist/banner.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
interface BossBannerProps {
|
|
3
|
-
/** Second line text (e.g. "Link projects", "Orchestrator"). */
|
|
4
|
-
subtitle: string;
|
|
5
|
-
/** Third line text (e.g. "↑↓ navigate · enter save"). */
|
|
6
|
-
hint?: string;
|
|
7
|
-
/**
|
|
8
|
-
* If true, show the standard chat-mode shortcut row (Ctrl+T tasks). Mirrors
|
|
9
|
-
* ggcoder's banner where the third row advertises ^T / ^S / ^P. Override
|
|
10
|
-
* with `hint` for non-chat banners (link picker, task overlay).
|
|
11
|
-
*/
|
|
12
|
-
showShortcuts?: boolean;
|
|
13
|
-
}
|
|
14
|
-
/** Ink banner — for use inside Ink-rendered screens. */
|
|
15
|
-
export declare function BossBanner({ subtitle, hint, showShortcuts }: BossBannerProps): React.ReactElement;
|
|
16
|
-
export {};
|
|
17
|
-
//# sourceMappingURL=banner.d.ts.map
|
package/dist/banner.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../src/banner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,eAAe;IACvB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CA2CjG"}
|
package/dist/banner.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import React from "react";
|
|
3
|
-
import { Box, Text } from "ink";
|
|
4
|
-
import { AUTHOR, BRAND, COLORS, GRADIENT, LOGO_GAP, LOGO_LINES, VERSION } from "./branding.js";
|
|
5
|
-
/** Ink banner — for use inside Ink-rendered screens. */
|
|
6
|
-
export function BossBanner({ subtitle, hint, showShortcuts }) {
|
|
7
|
-
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, marginBottom: 1, children: [_jsxs(Box, { children: [_jsx(GradientText, { text: LOGO_LINES[0] }), _jsx(Text, { children: LOGO_GAP }), _jsx(Text, { color: COLORS.primary, bold: true, children: BRAND }), _jsxs(Text, { color: COLORS.textDim, children: [" v", VERSION] }), _jsx(Text, { color: COLORS.textDim, children: " \u00B7 By " }), _jsx(Text, { color: COLORS.text, bold: true, children: AUTHOR })] }), _jsxs(Box, { children: [_jsx(GradientText, { text: LOGO_LINES[1] }), _jsx(Text, { children: LOGO_GAP }), _jsx(Text, { color: COLORS.accent, children: subtitle })] }), _jsxs(Box, { children: [_jsx(GradientText, { text: LOGO_LINES[2] }), _jsx(Text, { children: LOGO_GAP }), showShortcuts ? (_jsxs(Text, { children: [_jsx(Text, { color: COLORS.primary, children: "^T" }), _jsx(Text, { color: COLORS.textDim, children: " tasks" }), _jsx(Text, { color: COLORS.textDim, children: " " }), _jsx(Text, { color: COLORS.primary, children: "Tab" }), _jsx(Text, { color: COLORS.textDim, children: " scope" }), _jsx(Text, { color: COLORS.textDim, children: " " }), _jsx(Text, { color: COLORS.primary, children: "\u21E7Tab" }), _jsx(Text, { color: COLORS.textDim, children: " thinking" }), _jsx(Text, { color: COLORS.textDim, children: " " }), _jsx(Text, { color: COLORS.primary, children: "ESC" }), _jsx(Text, { color: COLORS.textDim, children: " interrupt" })] })) : (_jsx(Text, { color: COLORS.textDim, children: hint ?? "" }))] })] }));
|
|
8
|
-
}
|
|
9
|
-
function GradientText({ text }) {
|
|
10
|
-
const chars = [];
|
|
11
|
-
let colorIdx = 0;
|
|
12
|
-
for (let i = 0; i < text.length; i++) {
|
|
13
|
-
const ch = text[i];
|
|
14
|
-
if (ch === " ") {
|
|
15
|
-
chars.push(ch);
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
const color = GRADIENT[colorIdx % GRADIENT.length];
|
|
19
|
-
chars.push(_jsx(Text, { color: color, children: ch }, i));
|
|
20
|
-
colorIdx++;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
return _jsx(Text, { children: chars });
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=banner.js.map
|
package/dist/banner.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../src/banner.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAe/F,wDAAwD;AACxD,MAAM,UAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAmB;IAC3E,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,aACvD,MAAC,GAAG,eACF,KAAC,YAAY,IAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAE,GAAI,EACtC,KAAC,IAAI,cAAE,QAAQ,GAAQ,EACvB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,kBAC9B,KAAK,GACD,EACP,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,mBAAK,OAAO,IAAQ,EAC/C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,4BAAe,EAC1C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,kBAC3B,MAAM,GACF,IACH,EACN,MAAC,GAAG,eACF,KAAC,YAAY,IAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAE,GAAI,EACtC,KAAC,IAAI,cAAE,QAAQ,GAAQ,EACvB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,YAAG,QAAQ,GAAQ,IACzC,EACN,MAAC,GAAG,eACF,KAAC,YAAY,IAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAE,GAAI,EACtC,KAAC,IAAI,cAAE,QAAQ,GAAQ,EACtB,aAAa,CAAC,CAAC,CAAC,CACf,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,mBAAW,EACtC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,uBAAe,EAC1C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,YAAG,IAAI,GAAQ,EAC1C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,oBAAY,EACvC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,uBAAe,EAC1C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,YAAG,IAAI,GAAQ,EAC1C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,0BAAa,EACxC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,0BAAkB,EAC7C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,YAAG,IAAI,GAAQ,EAC1C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,oBAAY,EACvC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,2BAAmB,IACzC,CACR,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,YAAG,IAAI,IAAI,EAAE,GAAQ,CACjD,IACG,IACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,IAAI,EAAoB;IAC9C,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnD,KAAK,CAAC,IAAI,CACR,KAAC,IAAI,IAAS,KAAK,EAAE,KAAK,YACvB,EAAE,IADM,CAAC,CAEL,CACR,CAAC;YACF,QAAQ,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,KAAC,IAAI,cAAE,KAAK,GAAQ,CAAC;AAC9B,CAAC"}
|
package/dist/boss-footer.d.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
interface BossFooterProps {
|
|
3
|
-
bossModel: string;
|
|
4
|
-
workerModel: string;
|
|
5
|
-
/** Total input tokens of the boss's last turn — drives the context bar. */
|
|
6
|
-
tokensIn: number;
|
|
7
|
-
exitPending: boolean;
|
|
8
|
-
/** Boss extended-thinking level. Falsy when thinking is off. */
|
|
9
|
-
bossThinkingLevel?: string;
|
|
10
|
-
/** Auto-updater has installed a newer @kenkaiiii/gg-boss in the background.
|
|
11
|
-
* Show a "restart to apply" hint at the end of the footer row. */
|
|
12
|
-
updatePending?: boolean;
|
|
13
|
-
/** id of the currently-playing radio station (from RADIO_STATIONS), or null
|
|
14
|
-
* when the radio is off. Renders as `♪ <short name>` between thinking and
|
|
15
|
-
* the update notice. */
|
|
16
|
-
currentRadioStationId?: string | null;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Footer for gg-boss that mirrors ggcoder's Footer visual style — context bar
|
|
20
|
-
* with partial-block precision, percent, then BOTH models displayed in the
|
|
21
|
-
* same bold/coloured treatment so neither feels secondary.
|
|
22
|
-
*/
|
|
23
|
-
export declare function BossFooter({ bossModel, workerModel, tokensIn, exitPending, bossThinkingLevel, updatePending, currentRadioStationId, }: BossFooterProps): React.ReactElement;
|
|
24
|
-
export {};
|
|
25
|
-
//# sourceMappingURL=boss-footer.d.ts.map
|