@kenkaiiii/gg-boss 4.3.122 → 4.3.124
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/audio.d.ts +22 -0
- package/dist/audio.d.ts.map +1 -0
- package/dist/audio.js +215 -0
- package/dist/audio.js.map +1 -0
- package/dist/splash.d.ts.map +1 -1
- package/dist/splash.js +12 -1
- package/dist/splash.js.map +1 -1
- package/dist/splash.mp3 +0 -0
- package/package.json +4 -4
package/dist/audio.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
/**
|
|
8
|
+
* Cross-platform fire-and-forget MP3 playback. Tries the most likely binary
|
|
9
|
+
* for the host OS first, then a small chain of common Linux fallbacks.
|
|
10
|
+
*
|
|
11
|
+
* Platform notes:
|
|
12
|
+
* - macOS: `afplay` ships with the OS, always works for MP3.
|
|
13
|
+
* - Windows: PowerShell + WPF MediaPlayer is built-in and supports MP3 via
|
|
14
|
+
* DirectShow / MediaFoundation. Doesn't pop up a window because
|
|
15
|
+
* the script runs sync inside powershell.exe with -NoProfile.
|
|
16
|
+
* - Linux: No single guaranteed binary. Try mpv → ffplay → mpg123 → cvlc.
|
|
17
|
+
* If none are installed, give up silently — Linux desktop audio
|
|
18
|
+
* is fragmented enough that we don't want to bloat the package
|
|
19
|
+
* with a bundled player.
|
|
20
|
+
*/
|
|
21
|
+
export declare function playSplashAudio(): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=audio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"AA0FA;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAGjD;AA8DD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAwCrD"}
|
package/dist/audio.js
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
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 = [
|
|
49
|
+
0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1,
|
|
50
|
+
];
|
|
51
|
+
const BR_V2 = [
|
|
52
|
+
0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1,
|
|
53
|
+
];
|
|
54
|
+
const SR_V1 = [44100, 48000, 32000, -1];
|
|
55
|
+
const SR_V2 = [22050, 24000, 16000, -1];
|
|
56
|
+
const SR_V25 = [11025, 12000, 8000, -1];
|
|
57
|
+
const bitrate = (isMpeg1 ? BR_V1 : BR_V2)[bitrateIdx];
|
|
58
|
+
const sampleRate = (isMpeg1 ? SR_V1 : versionBits === 0x02 ? SR_V2 : SR_V25)[sampleRateIdx];
|
|
59
|
+
if (!bitrate || bitrate <= 0 || !sampleRate || sampleRate <= 0)
|
|
60
|
+
return null;
|
|
61
|
+
const samplesPerFrame = isMpeg1 ? 1152 : 576;
|
|
62
|
+
// Look for a Xing/Info header inside the first frame (offset depends on
|
|
63
|
+
// channel mode). If present, totalFrames * samplesPerFrame / sampleRate
|
|
64
|
+
// gives an accurate VBR duration.
|
|
65
|
+
const sideInfoOffset = isMpeg1 ? (((h2 >> 6) & 0x03) === 0x03 ? 17 : 32) : 9;
|
|
66
|
+
const xingTagOffset = i + 4 + sideInfoOffset;
|
|
67
|
+
if (xingTagOffset + 8 < buf.length) {
|
|
68
|
+
const tag = buf.toString("ascii", xingTagOffset, xingTagOffset + 4);
|
|
69
|
+
if (tag === "Xing" || tag === "Info") {
|
|
70
|
+
const flags = buf.readUInt32BE(xingTagOffset + 4);
|
|
71
|
+
if (flags & 0x01) {
|
|
72
|
+
// totalFrames is the next 32-bit BE
|
|
73
|
+
const totalFrames = buf.readUInt32BE(xingTagOffset + 8);
|
|
74
|
+
if (totalFrames > 0) {
|
|
75
|
+
return Math.round((totalFrames * samplesPerFrame * 1000) / sampleRate);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// CBR fallback: bytes / (bitrate*1000/8) → seconds.
|
|
81
|
+
const audioBytes = buf.length - i;
|
|
82
|
+
const seconds = audioBytes / ((bitrate * 1000) / 8);
|
|
83
|
+
if (!Number.isFinite(seconds) || seconds <= 0)
|
|
84
|
+
return null;
|
|
85
|
+
void padding; // padding affects per-frame size, immaterial at file scale
|
|
86
|
+
return Math.round(seconds * 1000);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Duration of the bundled splash audio, in milliseconds. Read once from the
|
|
94
|
+
* actual file so swapping the asset Just Works without anyone having to
|
|
95
|
+
* remember to bump a constant. Falls back to 1500ms if parsing fails.
|
|
96
|
+
*/
|
|
97
|
+
export function getSplashAudioDurationMs() {
|
|
98
|
+
const ms = readMp3DurationMs(splashAssetPath());
|
|
99
|
+
return ms && ms > 0 ? ms : 1500;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Resolve the bundled splash.mp3. The build script copies the asset from
|
|
103
|
+
* `assets/` to `dist/` so this path lands inside the published tarball when
|
|
104
|
+
* users `npm i -g`. Falls back to the source location during local dev where
|
|
105
|
+
* the build hasn't happened yet (rare — tsc runs every iteration).
|
|
106
|
+
*/
|
|
107
|
+
function splashAssetPath() {
|
|
108
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
109
|
+
const dist = path.join(here, "splash.mp3");
|
|
110
|
+
if (fs.existsSync(dist))
|
|
111
|
+
return dist;
|
|
112
|
+
// Dev fallback: dist/audio.js → ../assets/splash.mp3 in the source tree.
|
|
113
|
+
const dev = path.join(here, "..", "assets", "splash.mp3");
|
|
114
|
+
return dev;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Fire a candidate player as a detached child. Returns true if the spawn
|
|
118
|
+
* actually started successfully (no immediate ENOENT). The audio process
|
|
119
|
+
* outlives the splash unmount so playback can finish on its own. Stdio is
|
|
120
|
+
* redirected to /dev/null so the player can't pollute the TUI.
|
|
121
|
+
*/
|
|
122
|
+
function trySpawn(cmd, args) {
|
|
123
|
+
return new Promise((resolve) => {
|
|
124
|
+
let resolved = false;
|
|
125
|
+
try {
|
|
126
|
+
const child = spawn(cmd, args, {
|
|
127
|
+
detached: true,
|
|
128
|
+
stdio: "ignore",
|
|
129
|
+
});
|
|
130
|
+
child.once("error", () => {
|
|
131
|
+
// ENOENT (binary not installed) or permission failure — let the next
|
|
132
|
+
// candidate take a turn. Don't surface to the user.
|
|
133
|
+
if (!resolved) {
|
|
134
|
+
resolved = true;
|
|
135
|
+
resolve(false);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
child.once("spawn", () => {
|
|
139
|
+
if (!resolved) {
|
|
140
|
+
resolved = true;
|
|
141
|
+
// Detach so the parent process exiting doesn't kill the audio.
|
|
142
|
+
child.unref();
|
|
143
|
+
resolve(true);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
// Some Node versions fire neither immediately. After 50ms with no error,
|
|
147
|
+
// assume success — the spawn went through.
|
|
148
|
+
setTimeout(() => {
|
|
149
|
+
if (!resolved) {
|
|
150
|
+
resolved = true;
|
|
151
|
+
child.unref();
|
|
152
|
+
resolve(true);
|
|
153
|
+
}
|
|
154
|
+
}, 50);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
resolve(false);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Cross-platform fire-and-forget MP3 playback. Tries the most likely binary
|
|
163
|
+
* for the host OS first, then a small chain of common Linux fallbacks.
|
|
164
|
+
*
|
|
165
|
+
* Platform notes:
|
|
166
|
+
* - macOS: `afplay` ships with the OS, always works for MP3.
|
|
167
|
+
* - Windows: PowerShell + WPF MediaPlayer is built-in and supports MP3 via
|
|
168
|
+
* DirectShow / MediaFoundation. Doesn't pop up a window because
|
|
169
|
+
* the script runs sync inside powershell.exe with -NoProfile.
|
|
170
|
+
* - Linux: No single guaranteed binary. Try mpv → ffplay → mpg123 → cvlc.
|
|
171
|
+
* If none are installed, give up silently — Linux desktop audio
|
|
172
|
+
* is fragmented enough that we don't want to bloat the package
|
|
173
|
+
* with a bundled player.
|
|
174
|
+
*/
|
|
175
|
+
export async function playSplashAudio() {
|
|
176
|
+
const file = splashAssetPath();
|
|
177
|
+
if (!fs.existsSync(file))
|
|
178
|
+
return;
|
|
179
|
+
const platform = process.platform;
|
|
180
|
+
if (platform === "darwin") {
|
|
181
|
+
await trySpawn("afplay", [file]);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (platform === "win32") {
|
|
185
|
+
// Escape single quotes in the path for the PowerShell -Command argument.
|
|
186
|
+
const safe = file.replace(/'/g, "''");
|
|
187
|
+
const script = [
|
|
188
|
+
"Add-Type -AssemblyName presentationCore;",
|
|
189
|
+
"$p = New-Object System.Windows.Media.MediaPlayer;",
|
|
190
|
+
`$p.Open([uri]'${safe}');`,
|
|
191
|
+
"$p.Play();",
|
|
192
|
+
// Sleep so the powershell process stays alive long enough to actually
|
|
193
|
+
// play the clip (MediaPlayer is async; if powershell exits the GC
|
|
194
|
+
// tears the player down before sound plays). Match clip length + a beat.
|
|
195
|
+
"Start-Sleep -Seconds 5;",
|
|
196
|
+
].join(" ");
|
|
197
|
+
await trySpawn("powershell.exe", ["-NoProfile", "-WindowStyle", "Hidden", "-Command", script]);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
// Linux + everything else: walk the candidates.
|
|
201
|
+
const linuxCandidates = [
|
|
202
|
+
{ cmd: "mpv", args: ["--really-quiet", "--no-video", file] },
|
|
203
|
+
{ cmd: "ffplay", args: ["-nodisp", "-autoexit", "-loglevel", "quiet", file] },
|
|
204
|
+
{ cmd: "mpg123", args: ["-q", file] },
|
|
205
|
+
{ cmd: "mpg321", args: ["-q", file] },
|
|
206
|
+
{ cmd: "cvlc", args: ["--play-and-exit", "--quiet", file] },
|
|
207
|
+
{ cmd: "paplay", args: [file] },
|
|
208
|
+
];
|
|
209
|
+
for (const c of linuxCandidates) {
|
|
210
|
+
const ok = await trySpawn(c.cmd, c.args);
|
|
211
|
+
if (ok)
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=audio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"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"}
|
package/dist/splash.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"splash.d.ts","sourceRoot":"","sources":["../src/splash.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"splash.d.ts","sourceRoot":"","sources":["../src/splash.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAoFnD,UAAU,iBAAiB;IACzB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,iBAAiB,GAAG,KAAK,CAAC,YAAY,CAgE/E;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IACtE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CA2BA"}
|
package/dist/splash.js
CHANGED
|
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import React, { useEffect, useState } from "react";
|
|
3
3
|
import { Box, Text, render } from "ink";
|
|
4
4
|
import { AUTHOR, BRAND, COLORS, GRADIENT, VERSION } from "./branding.js";
|
|
5
|
+
import { getSplashAudioDurationMs, playSplashAudio } from "./audio.js";
|
|
5
6
|
/**
|
|
6
7
|
* Big ASCII "GG Boss" rendered for the splash. The block characters here are
|
|
7
8
|
* ANSI Shadow-style figlet output. Whitespace is significant — every line is
|
|
@@ -107,10 +108,20 @@ export function SplashScreen({ caption }) {
|
|
|
107
108
|
*/
|
|
108
109
|
export function showSplash(opts) {
|
|
109
110
|
const start = Date.now();
|
|
111
|
+
// Fire-and-forget — never await. If the platform has no working player or
|
|
112
|
+
// the bundled mp3 is missing, this resolves to nothing and the splash just
|
|
113
|
+
// plays silently. Errors are swallowed inside playSplashAudio so the user
|
|
114
|
+
// never sees an audio-related crash on launch.
|
|
115
|
+
void playSplashAudio();
|
|
110
116
|
const instance = render(_jsx(SplashScreen, { caption: opts.caption }));
|
|
117
|
+
// Default the minimum visible time to the audio duration so the user
|
|
118
|
+
// doesn't get dumped into the chat mid-jingle. A small +200ms tail keeps
|
|
119
|
+
// the last beat from being clipped by terminal-app sound shutdown.
|
|
120
|
+
const audioDurationMs = getSplashAudioDurationMs();
|
|
121
|
+
const defaultMinMs = audioDurationMs + 200;
|
|
111
122
|
return {
|
|
112
123
|
dismiss: async () => {
|
|
113
|
-
const minMs = opts.minMs ??
|
|
124
|
+
const minMs = opts.minMs ?? defaultMinMs;
|
|
114
125
|
const elapsed = Date.now() - start;
|
|
115
126
|
const remaining = Math.max(0, minMs - elapsed);
|
|
116
127
|
if (remaining > 0) {
|
package/dist/splash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"splash.js","sourceRoot":"","sources":["../src/splash.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"splash.js","sourceRoot":"","sources":["../src/splash.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEvE;;;;GAIG;AACH,MAAM,YAAY,GAAsB;IACtC,qEAAqE;IACrE,qEAAqE;IACrE,qEAAqE;IACrE,qEAAqE;IACrE,qEAAqE;IACrE,qEAAqE;IACrE,qEAAqE;IACrE,qEAAqE;CACtE,CAAC;AAEF,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC;AAE7C;;;;;;GAMG;AACH,SAAS,YAAY,CAAC,OAAe,EAAE,UAAkB,EAAE,MAAc;IACvE,MAAM,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,UAAU,CAAC;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC7E,OAAO,QAAQ,CAAC,GAAG,CAAE,CAAC;AACxB,CAAC;AAQD,SAAS,UAAU,CAAC,EAAE,MAAM,EAAe;IACzC,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACxB,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YAC5B,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACzD,uEAAuE;YACvE,sEAAsE;YACtE,8BAA8B;YAC9B,MAAM,QAAQ,GAAqC,EAAE,CAAC;YACtD,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAG,EAAE,KAAK,GAAG,CAAC;gBACvB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC9C,GAAG,GAAG,EAAE,CAAC;oBACT,MAAM,GAAG,GAAG,CAAC;oBACb,SAAS;gBACX,CAAC;gBACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;oBACnB,GAAG,IAAI,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC1C,GAAG,GAAG,EAAE,CAAC;oBACT,MAAM,GAAG,GAAG,CAAC;gBACf,CAAC;YACH,CAAC;YACD,IAAI,GAAG;gBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YAEnD,OAAO,CACL,KAAC,IAAI,cACF,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,KAAC,IAAI,IAAS,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,YACxC,GAAG,CAAC,IAAI,IADA,CAAC,CAEL,CACR,CAAC,IALO,CAAC,CAML,CACR,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,YAAY,CAAC,EAAE,OAAO,EAAqB;IACzD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxC,0EAA0E;IAC1E,2EAA2E;IAC3E,mCAAmC;IACnC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,0EAA0E;IAC1E,uEAAuE;IACvE,6DAA6D;IAC7D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QACtC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;QACrC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;KAChC,CAAC,CAAC,CAAC;IACJ,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,GAAS,EAAE,CACzB,OAAO,CAAC;YACN,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;YACrC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;SAChC,CAAC,CAAC;QACL,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,8EAA8E;IAC9E,0EAA0E;IAC1E,2EAA2E;IAC3E,oEAAoE;IACpE,MAAM,mBAAmB,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAEnF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAC,QAAQ,aAErF,KAAC,GAAG,IAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,GAAI,EAC3C,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,YAAY,EAAC,UAAU,EAAE,CAAC,aAC/D,KAAC,UAAU,IAAC,MAAM,EAAE,MAAM,GAAI,EAC9B,KAAC,GAAG,IAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,EAAE,cAAc,EAAC,QAAQ,YAC7D,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,kBAC3B,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,IACF,GACH,EACN,KAAC,GAAG,IAAC,KAAK,EAAE,YAAY,EAAE,cAAc,EAAC,QAAQ,YAC/C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,YAAG,OAAO,IAAI,+BAA+B,GAAQ,GAC5E,IACF,IACF,CACP,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,IAA0C;IAGnE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,0EAA0E;IAC1E,2EAA2E;IAC3E,0EAA0E;IAC1E,+CAA+C;IAC/C,KAAK,eAAe,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAC,YAAY,IAAC,OAAO,EAAE,IAAI,CAAC,OAAO,GAAI,CAAC,CAAC;IACjE,qEAAqE;IACrE,yEAAyE;IACzE,mEAAmE;IACnE,MAAM,eAAe,GAAG,wBAAwB,EAAE,CAAC;IACnD,MAAM,YAAY,GAAG,eAAe,GAAG,GAAG,CAAC;IAC3C,OAAO;QACL,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC;YACzC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC;YAC/C,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBAClB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,QAAQ,CAAC,OAAO,EAAE,CAAC;YACnB,kEAAkE;YAClE,iCAAiC;YACjC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/splash.mp3
ADDED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kenkaiiii/gg-boss",
|
|
3
|
-
"version": "4.3.
|
|
3
|
+
"version": "4.3.124",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Orchestrator agent that drives multiple ggcoder sessions across projects from a single chat",
|
|
6
6
|
"license": "MIT",
|
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
"ink": "^7.0.2",
|
|
27
27
|
"react": "^19.2.5",
|
|
28
28
|
"zod": "^4.4.3",
|
|
29
|
-
"@kenkaiiii/ggcoder": "4.3.99",
|
|
30
29
|
"@kenkaiiii/gg-agent": "4.3.96",
|
|
31
|
-
"@kenkaiiii/gg-ai": "4.3.96"
|
|
30
|
+
"@kenkaiiii/gg-ai": "4.3.96",
|
|
31
|
+
"@kenkaiiii/ggcoder": "4.3.99"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@types/node": "^25.6.0",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"access": "public"
|
|
41
41
|
},
|
|
42
42
|
"scripts": {
|
|
43
|
-
"build": "tsc",
|
|
43
|
+
"build": "tsc && cp assets/splash.mp3 dist/splash.mp3",
|
|
44
44
|
"check": "tsc --noEmit",
|
|
45
45
|
"test": "vitest run"
|
|
46
46
|
}
|