@kenkaiiii/gg-boss 4.3.140 → 4.3.141

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.
Files changed (162) hide show
  1. package/dist/{chunk-JVQDTPYR.js → chunk-3EWLK53W.js} +18 -9
  2. package/dist/{chunk-JVQDTPYR.js.map → chunk-3EWLK53W.js.map} +1 -1
  3. package/dist/{chunk-5WNYQQPQ.js → chunk-QT366Y52.js} +4 -3
  4. package/dist/{chunk-5WNYQQPQ.js.map → chunk-QT366Y52.js.map} +1 -1
  5. package/dist/{chunk-PQAHDHVY.js → chunk-WJ4S4TOY.js} +3 -2
  6. package/dist/{chunk-PQAHDHVY.js.map → chunk-WJ4S4TOY.js.map} +1 -1
  7. package/dist/{chunk-B2WQ5E5J.js → chunk-YNWFCUMR.js} +2 -1
  8. package/dist/{chunk-B2WQ5E5J.js.map → chunk-YNWFCUMR.js.map} +1 -1
  9. package/dist/cli.js +2246 -182
  10. package/dist/cli.js.map +1 -1
  11. package/dist/{devtools-VBUDNGEI.js → devtools-4TI4D7F2.js} +3 -2
  12. package/dist/{devtools-VBUDNGEI.js.map → devtools-4TI4D7F2.js.map} +1 -1
  13. package/dist/{dist-7DAPKZGX.js → dist-VXOVSHZ5.js} +3 -2
  14. package/dist/{dist-7DAPKZGX.js.map → dist-VXOVSHZ5.js.map} +1 -1
  15. package/dist/{ignore-3AEIALHQ.js → ignore-76P4EAAU.js} +3 -2
  16. package/dist/{ignore-3AEIALHQ.js.map → ignore-76P4EAAU.js.map} +1 -1
  17. package/dist/index.js +21 -4
  18. package/dist/index.js.map +1 -1
  19. package/dist/{out-D65DTPFZ.js → out-XEXARMKS.js} +3 -2
  20. package/dist/{out-D65DTPFZ.js.map → out-XEXARMKS.js.map} +1 -1
  21. package/dist/pixel-WPYTQADG.js +14 -0
  22. package/dist/{pixel-fix-ALWXCLTS.js → pixel-fix-4WGZAJ5W.js} +4 -3
  23. package/dist/{pixel-fix-ALWXCLTS.js.map → pixel-fix-4WGZAJ5W.js.map} +1 -1
  24. package/package.json +10 -11
  25. package/dist/audio.d.ts +0 -21
  26. package/dist/audio.d.ts.map +0 -1
  27. package/dist/audio.js +0 -231
  28. package/dist/audio.js.map +0 -1
  29. package/dist/audio.test.d.ts +0 -2
  30. package/dist/audio.test.d.ts.map +0 -1
  31. package/dist/audio.test.js +0 -13
  32. package/dist/audio.test.js.map +0 -1
  33. package/dist/auto-update.d.ts +0 -24
  34. package/dist/auto-update.d.ts.map +0 -1
  35. package/dist/auto-update.js +0 -231
  36. package/dist/auto-update.js.map +0 -1
  37. package/dist/banner.d.ts +0 -17
  38. package/dist/banner.d.ts.map +0 -1
  39. package/dist/banner.js +0 -25
  40. package/dist/banner.js.map +0 -1
  41. package/dist/boss-footer.d.ts +0 -25
  42. package/dist/boss-footer.d.ts.map +0 -1
  43. package/dist/boss-footer.js +0 -107
  44. package/dist/boss-footer.js.map +0 -1
  45. package/dist/boss-phrases.d.ts +0 -9
  46. package/dist/boss-phrases.d.ts.map +0 -1
  47. package/dist/boss-phrases.js +0 -71
  48. package/dist/boss-phrases.js.map +0 -1
  49. package/dist/boss-store.d.ts +0 -245
  50. package/dist/boss-store.d.ts.map +0 -1
  51. package/dist/boss-store.js +0 -623
  52. package/dist/boss-store.js.map +0 -1
  53. package/dist/boss-system-prompt.d.ts +0 -3
  54. package/dist/boss-system-prompt.d.ts.map +0 -1
  55. package/dist/boss-system-prompt.js +0 -180
  56. package/dist/boss-system-prompt.js.map +0 -1
  57. package/dist/boss-tasks-overlay.d.ts +0 -22
  58. package/dist/boss-tasks-overlay.d.ts.map +0 -1
  59. package/dist/boss-tasks-overlay.js +0 -157
  60. package/dist/boss-tasks-overlay.js.map +0 -1
  61. package/dist/branding.d.ts +0 -32
  62. package/dist/branding.d.ts.map +0 -1
  63. package/dist/branding.js +0 -59
  64. package/dist/branding.js.map +0 -1
  65. package/dist/cli.d.ts +0 -3
  66. package/dist/cli.d.ts.map +0 -1
  67. package/dist/cli.smoke.test.d.ts +0 -2
  68. package/dist/cli.smoke.test.d.ts.map +0 -1
  69. package/dist/cli.smoke.test.js +0 -48
  70. package/dist/cli.smoke.test.js.map +0 -1
  71. package/dist/colors.d.ts +0 -14
  72. package/dist/colors.d.ts.map +0 -1
  73. package/dist/colors.js +0 -31
  74. package/dist/colors.js.map +0 -1
  75. package/dist/discover.d.ts +0 -13
  76. package/dist/discover.d.ts.map +0 -1
  77. package/dist/discover.js +0 -92
  78. package/dist/discover.js.map +0 -1
  79. package/dist/event-queue.d.ts +0 -16
  80. package/dist/event-queue.d.ts.map +0 -1
  81. package/dist/event-queue.js +0 -39
  82. package/dist/event-queue.js.map +0 -1
  83. package/dist/index.d.ts +0 -6
  84. package/dist/index.d.ts.map +0 -1
  85. package/dist/link-command.d.ts +0 -2
  86. package/dist/link-command.d.ts.map +0 -1
  87. package/dist/link-command.js +0 -120
  88. package/dist/link-command.js.map +0 -1
  89. package/dist/links.d.ts +0 -11
  90. package/dist/links.d.ts.map +0 -1
  91. package/dist/links.js +0 -22
  92. package/dist/links.js.map +0 -1
  93. package/dist/logger.d.ts +0 -41
  94. package/dist/logger.d.ts.map +0 -1
  95. package/dist/logger.js +0 -112
  96. package/dist/logger.js.map +0 -1
  97. package/dist/orchestrator-app.d.ts +0 -15
  98. package/dist/orchestrator-app.d.ts.map +0 -1
  99. package/dist/orchestrator-app.js +0 -599
  100. package/dist/orchestrator-app.js.map +0 -1
  101. package/dist/orchestrator.d.ts +0 -147
  102. package/dist/orchestrator.d.ts.map +0 -1
  103. package/dist/orchestrator.js +0 -707
  104. package/dist/orchestrator.js.map +0 -1
  105. package/dist/orchestrator.test.d.ts +0 -2
  106. package/dist/orchestrator.test.d.ts.map +0 -1
  107. package/dist/orchestrator.test.js +0 -55
  108. package/dist/orchestrator.test.js.map +0 -1
  109. package/dist/pixel-WB6VRJWP.js +0 -13
  110. package/dist/radio-picker.d.ts +0 -20
  111. package/dist/radio-picker.d.ts.map +0 -1
  112. package/dist/radio-picker.js +0 -31
  113. package/dist/radio-picker.js.map +0 -1
  114. package/dist/radio.d.ts +0 -43
  115. package/dist/radio.d.ts.map +0 -1
  116. package/dist/radio.js +0 -150
  117. package/dist/radio.js.map +0 -1
  118. package/dist/sessions.d.ts +0 -21
  119. package/dist/sessions.d.ts.map +0 -1
  120. package/dist/sessions.js +0 -122
  121. package/dist/sessions.js.map +0 -1
  122. package/dist/settings.d.ts +0 -11
  123. package/dist/settings.d.ts.map +0 -1
  124. package/dist/settings.js +0 -38
  125. package/dist/settings.js.map +0 -1
  126. package/dist/slash-commands.d.ts +0 -19
  127. package/dist/slash-commands.d.ts.map +0 -1
  128. package/dist/slash-commands.js +0 -76
  129. package/dist/slash-commands.js.map +0 -1
  130. package/dist/splash.d.ts +0 -21
  131. package/dist/splash.d.ts.map +0 -1
  132. package/dist/splash.js +0 -137
  133. package/dist/splash.js.map +0 -1
  134. package/dist/task-tools.d.ts +0 -18
  135. package/dist/task-tools.d.ts.map +0 -1
  136. package/dist/task-tools.js +0 -172
  137. package/dist/task-tools.js.map +0 -1
  138. package/dist/tasks-store.d.ts +0 -66
  139. package/dist/tasks-store.d.ts.map +0 -1
  140. package/dist/tasks-store.js +0 -199
  141. package/dist/tasks-store.js.map +0 -1
  142. package/dist/tasks-store.test.d.ts +0 -2
  143. package/dist/tasks-store.test.d.ts.map +0 -1
  144. package/dist/tasks-store.test.js +0 -138
  145. package/dist/tasks-store.test.js.map +0 -1
  146. package/dist/tool-formatters.d.ts +0 -7
  147. package/dist/tool-formatters.d.ts.map +0 -1
  148. package/dist/tool-formatters.js +0 -111
  149. package/dist/tool-formatters.js.map +0 -1
  150. package/dist/tools.d.ts +0 -26
  151. package/dist/tools.d.ts.map +0 -1
  152. package/dist/tools.js +0 -133
  153. package/dist/tools.js.map +0 -1
  154. package/dist/types.d.ts +0 -32
  155. package/dist/types.d.ts.map +0 -1
  156. package/dist/types.js +0 -2
  157. package/dist/types.js.map +0 -1
  158. package/dist/worker.d.ts +0 -47
  159. package/dist/worker.d.ts.map +0 -1
  160. package/dist/worker.js +0 -123
  161. package/dist/worker.js.map +0 -1
  162. /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
@@ -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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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=audio.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audio.test.d.ts","sourceRoot":"","sources":["../src/audio.test.ts"],"names":[],"mappings":""}
@@ -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
@@ -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"}
@@ -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"}
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAC1C,MAAM,YAAY,GAAG,8BAA8B,YAAY,SAAS,CAAC;AACzE,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AACnD,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAShC,IAAK,cAKJ;AALD,WAAK,cAAc;IACjB,6BAAW,CAAA;IACX,+BAAa,CAAA;IACb,+BAAa,CAAA;IACb,qCAAmB,CAAA;AACrB,CAAC,EALI,cAAc,KAAd,cAAc,QAKlB;AAOD,SAAS,gBAAgB;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,EAAE,OAAO,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAkB;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC7C,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,CAAS,EAAE,CAAS;IAC3C,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/D,qDAAqD;IACrD,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,cAAc,EAAE,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACzE,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACzE,OAAO;YACL,cAAc,EAAE,cAAc,CAAC,IAAI;YACnC,aAAa,EAAE,eAAe,YAAY,SAAS;SACpD,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC1E,OAAO;YACL,cAAc,EAAE,cAAc,CAAC,IAAI;YACnC,aAAa,EAAE,mBAAmB,YAAY,SAAS;SACxD,CAAC;IACJ,CAAC;IACD,OAAO;QACL,cAAc,EAAE,cAAc,CAAC,GAAG;QAClC,aAAa,EAAE,kBAAkB,YAAY,SAAS;KACvD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1E,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QACrC,OAAO,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,OAAe;IAChD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YAC7C,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;YACf,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,QAAQ,EAAE;SACvD,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,cAAsB;IACvD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,IAAI,OAAO,GAAkB,IAAI,CAAC;QAElC,8DAA8D;QAC9D,IAAI,KAAK,EAAE,aAAa,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YAChD,IAAI,eAAe,CAAC,KAAK,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7D,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;gBACjC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBACvB,yBAAyB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;oBAC9C,OAAO,GAAG,oBAAoB,KAAK,CAAC,aAAa,4DAA4D,CAAC;oBAC9G,UAAU,CAAC;wBACT,GAAG,KAAK;wBACR,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE;wBACzB,aAAa,EAAE,KAAK;wBACpB,iBAAiB,EAAE,IAAI,CAAC,GAAG,EAAE;qBAC9B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,sEAAsE;gBACtE,UAAU,CAAC,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,MAAM,WAAW,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,aAAa,GAAG,iBAAiB,CAAC;QACnF,IAAI,WAAW;YAAE,uBAAuB,CAAC,cAAc,CAAC,CAAC;QAEzD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,cAAsB;IACrD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,aAAa;YAAE,OAAO,IAAI,CAAC;QACvC,IAAI,eAAe,CAAC,KAAK,CAAC,aAAa,EAAE,cAAc,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3E,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,cAAsB;IACrD,kBAAkB,EAAE;SACjB,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE;QACtB,MAAM,QAAQ,GAAgB;YAC5B,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE;YACzB,aAAa,EAAE,aAAa,IAAI,SAAS;YACzC,aAAa,EAAE,KAAK;SACrB,CAAC;QACF,IAAI,aAAa,IAAI,eAAe,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACxE,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC;QAChC,CAAC;QACD,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE;QACV,2CAA2C;IAC7C,CAAC,CAAC,CAAC;AACP,CAAC;AAED,8DAA8D;AAE9D,IAAI,aAAa,GAA0C,IAAI,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,cAAsB,EACtB,QAAmC;IAEnC,IAAI,aAAa;QAAE,OAAO;IAC1B,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,kBAAkB,EAAE;aACjB,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE;YACtB,IAAI,CAAC,aAAa;gBAAE,OAAO;YAC3B,IAAI,eAAe,CAAC,aAAa,EAAE,cAAc,CAAC,IAAI,CAAC;gBAAE,OAAO;YAChE,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,aAAa;gBAAE,OAAO;YAChC,UAAU,CAAC;gBACT,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE;gBACzB,aAAa;gBACb,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YACH,QAAQ,CACN,oCAAoC,cAAc,MAAM,aAAa,uCAAuC,IAAI,CAAC,aAAa,sBAAsB,CACrJ,CAAC;YACF,uBAAuB,EAAE,CAAC;QAC5B,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,aAAa;QACf,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACtB,aAAa,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,IAAI,aAAa,EAAE,CAAC;QAClB,aAAa,CAAC,aAAa,CAAC,CAAC;QAC7B,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;AACH,CAAC"}
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
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"banner.js","sourceRoot":"","sources":["../src/banner.tsx"],"names":[],"mappings":"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"}
@@ -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