github-router 0.3.261 → 0.3.263
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/{attribution-settings-Bl0HHJQF.js → attribution-settings-DFIVIRG8.js} +3 -3
- package/dist/{attribution-settings-Bl0HHJQF.js.map → attribution-settings-DFIVIRG8.js.map} +1 -1
- package/dist/{auth-I8k2OOvA.js → auth-WA88cE9q.js} +2 -2
- package/dist/{auth-I8k2OOvA.js.map → auth-WA88cE9q.js.map} +1 -1
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/{check-usage-SOn7-cWc.js → check-usage-v2apGKz7.js} +3 -3
- package/dist/{check-usage-SOn7-cWc.js.map → check-usage-v2apGKz7.js.map} +1 -1
- package/dist/{claude-CEaI47j7.js → claude-BCI3Sx6_.js} +9 -10
- package/dist/{claude-CEaI47j7.js.map → claude-BCI3Sx6_.js.map} +1 -1
- package/dist/{codex-C6Eyz3EV.js → codex-DyJIrbJt.js} +5 -6
- package/dist/{codex-C6Eyz3EV.js.map → codex-DyJIrbJt.js.map} +1 -1
- package/dist/engine-D8dlcSW6.js +2 -0
- package/dist/{gate-discovery-BnPhH_AC.js → gate-discovery-cMbt8Ct2.js} +3 -3
- package/dist/{gate-discovery-BnPhH_AC.js.map → gate-discovery-cMbt8Ct2.js.map} +1 -1
- package/dist/{get-copilot-usage-CYpAsYrM.js → get-copilot-usage-DOFJWJaQ.js} +2 -2
- package/dist/{get-copilot-usage-CYpAsYrM.js.map → get-copilot-usage-DOFJWJaQ.js.map} +1 -1
- package/dist/{internal-prompt-submit-CSJR24-y.js → internal-prompt-submit-C0XOPgcP.js} +2 -2
- package/dist/{internal-prompt-submit-CSJR24-y.js.map → internal-prompt-submit-C0XOPgcP.js.map} +1 -1
- package/dist/{internal-stop-hook-CiflCJO-.js → internal-stop-hook-CBcE2Js8.js} +4 -4
- package/dist/{internal-stop-hook-CiflCJO-.js.map → internal-stop-hook-CBcE2Js8.js.map} +1 -1
- package/dist/main.js +9 -9
- package/dist/{models-uQgsKNNC.js → models-Cv6gprpy.js} +2 -2
- package/dist/{models-uQgsKNNC.js.map → models-Cv6gprpy.js.map} +1 -1
- package/dist/{orchestration-BiZviyam.js → orchestration-B6qidQAd.js} +2 -2
- package/dist/{orchestration-BiZviyam.js.map → orchestration-B6qidQAd.js.map} +1 -1
- package/dist/{peer-mcp-personas-V4AXhm9B.js → peer-mcp-personas-B22ncnbQ.js} +38 -23
- package/dist/peer-mcp-personas-B22ncnbQ.js.map +1 -0
- package/dist/{provision-BLwsOFCI.js → provision-DSpLQHC3.js} +2 -2
- package/dist/{provision-BLwsOFCI.js.map → provision-DSpLQHC3.js.map} +1 -1
- package/dist/{serve-De-kqWXM.js → serve-D9tBVVoK.js} +16 -11
- package/dist/{serve-De-kqWXM.js.map → serve-D9tBVVoK.js.map} +1 -1
- package/dist/{server-setup-BeeT8m-w.js → server-setup-BM9Smfek.js} +317 -20
- package/dist/server-setup-BM9Smfek.js.map +1 -0
- package/dist/{start-DEC0M8UH.js → start-D7Hx2T_T.js} +3 -3
- package/dist/{start-DEC0M8UH.js.map → start-D7Hx2T_T.js.map} +1 -1
- package/dist/{stop-gate-hook-DoYD9Wt8.js → stop-gate-hook-Bmwla_2u.js} +10 -5
- package/dist/{stop-gate-hook-DoYD9Wt8.js.map → stop-gate-hook-Bmwla_2u.js.map} +1 -1
- package/dist/{token-DWknHe9M.js → token-C8Uh7aUe.js} +73 -12
- package/dist/{token-DWknHe9M.js.map → token-C8Uh7aUe.js.map} +1 -1
- package/package.json +1 -1
- package/dist/engine-B4Ohhv5i.js +0 -2
- package/dist/file-log-reporter-vI8qCFNM.js +0 -158
- package/dist/file-log-reporter-vI8qCFNM.js.map +0 -1
- package/dist/peer-mcp-personas-V4AXhm9B.js.map +0 -1
- package/dist/server-setup-BeeT8m-w.js.map +0 -1
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import { t as PATHS } from "./paths-BXrbboAS.js";
|
|
2
|
-
import consola from "consola";
|
|
3
|
-
import fs from "node:fs";
|
|
4
|
-
import { Writable } from "node:stream";
|
|
5
|
-
//#region src/lib/file-log-reporter.ts
|
|
6
|
-
const MAX_LOG_BYTES = 1048576;
|
|
7
|
-
const DEDUP_MAX = 1e3;
|
|
8
|
-
const ARG_MAX_LEN = 2048;
|
|
9
|
-
const DEDUP_KEY_MAX_LEN = 200;
|
|
10
|
-
const CREDENTIAL_RE = /\b(eyJ[A-Za-z0-9_-]{20,}(?:\.[A-Za-z0-9_-]+){0,2}|gh[opsu]_[A-Za-z0-9_]{20,}|Bearer\s+\S{20,})\b/g;
|
|
11
|
-
const ALLOWED_TYPES = /* @__PURE__ */ new Set([
|
|
12
|
-
"fatal",
|
|
13
|
-
"error",
|
|
14
|
-
"warn"
|
|
15
|
-
]);
|
|
16
|
-
function sanitize(line) {
|
|
17
|
-
return line.replace(CREDENTIAL_RE, "[REDACTED]");
|
|
18
|
-
}
|
|
19
|
-
function serializeArg(arg) {
|
|
20
|
-
if (typeof arg === "string") return arg;
|
|
21
|
-
if (arg instanceof Error) {
|
|
22
|
-
const parts = [arg.message];
|
|
23
|
-
if (arg.stack) parts.push(arg.stack);
|
|
24
|
-
return parts.join("\n");
|
|
25
|
-
}
|
|
26
|
-
return String(arg);
|
|
27
|
-
}
|
|
28
|
-
function formatLogLine(logObj) {
|
|
29
|
-
return sanitize(`${logObj.date.toISOString()} [${(logObj.type ?? "error").toUpperCase()}] ${logObj.args.map((a) => {
|
|
30
|
-
const s = serializeArg(a);
|
|
31
|
-
return s.length > ARG_MAX_LEN ? s.slice(0, ARG_MAX_LEN) + "…" : s;
|
|
32
|
-
}).join(" ").replace(/\r\n|\r|\n/g, "\\n")}\n`);
|
|
33
|
-
}
|
|
34
|
-
function makeDedupeKey(logObj) {
|
|
35
|
-
const firstArg = logObj.args.length > 0 ? serializeArg(logObj.args[0]) : "";
|
|
36
|
-
const key = `${logObj.type}:${firstArg}`;
|
|
37
|
-
return key.length > DEDUP_KEY_MAX_LEN ? key.slice(0, DEDUP_KEY_MAX_LEN) : key;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Construction-time rotation: rename the log aside if it's already over the
|
|
41
|
-
* cap before we start appending. Runs with no descriptor held (the instance
|
|
42
|
-
* fd is opened lazily on the first `log()`), so a plain path stat + rename is
|
|
43
|
-
* correct here. The per-`log()` ceiling check lives in `rotateIfNeeded()`.
|
|
44
|
-
*/
|
|
45
|
-
function rotateAtStartup(filePath) {
|
|
46
|
-
let size;
|
|
47
|
-
try {
|
|
48
|
-
size = fs.statSync(filePath).size;
|
|
49
|
-
} catch {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
if (size <= MAX_LOG_BYTES) return;
|
|
53
|
-
try {
|
|
54
|
-
fs.renameSync(filePath, filePath + ".1");
|
|
55
|
-
} catch {}
|
|
56
|
-
}
|
|
57
|
-
var FileLogReporter = class FileLogReporter {
|
|
58
|
-
filePath;
|
|
59
|
-
seen = /* @__PURE__ */ new Set();
|
|
60
|
-
bytesSinceCheck = 0;
|
|
61
|
-
static ROTATE_CHECK_BYTES = MAX_LOG_BYTES / 2;
|
|
62
|
-
fd;
|
|
63
|
-
constructor(filePath) {
|
|
64
|
-
this.filePath = filePath;
|
|
65
|
-
rotateAtStartup(filePath);
|
|
66
|
-
}
|
|
67
|
-
ensureFd() {
|
|
68
|
-
if (this.fd !== void 0) return this.fd;
|
|
69
|
-
try {
|
|
70
|
-
this.fd = fs.openSync(this.filePath, "a", 384);
|
|
71
|
-
} catch {
|
|
72
|
-
this.fd = void 0;
|
|
73
|
-
}
|
|
74
|
-
return this.fd;
|
|
75
|
-
}
|
|
76
|
-
closeFd() {
|
|
77
|
-
if (this.fd === void 0) return;
|
|
78
|
-
try {
|
|
79
|
-
fs.closeSync(this.fd);
|
|
80
|
-
} catch {}
|
|
81
|
-
this.fd = void 0;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Enforce the MAX_LOG_BYTES ceiling. Sizes the LIVE file (fstat on the open
|
|
85
|
-
* fd when we hold one — no path race — else a path stat), and on overflow
|
|
86
|
-
* CLOSES the fd before renaming. Closing first is load-bearing on Windows
|
|
87
|
-
* (renaming a file with an open handle fails with EBUSY/EPERM) and correct
|
|
88
|
-
* on POSIX too (a held append-fd would otherwise keep writing into the
|
|
89
|
-
* renamed `.1` inode). The fd is left closed so the next write reopens the
|
|
90
|
-
* freshly-created file.
|
|
91
|
-
*/
|
|
92
|
-
rotateIfNeeded() {
|
|
93
|
-
let size;
|
|
94
|
-
try {
|
|
95
|
-
size = this.fd !== void 0 ? fs.fstatSync(this.fd).size : fs.statSync(this.filePath).size;
|
|
96
|
-
} catch {
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
if (size <= MAX_LOG_BYTES) return;
|
|
100
|
-
this.closeFd();
|
|
101
|
-
try {
|
|
102
|
-
fs.renameSync(this.filePath, this.filePath + ".1");
|
|
103
|
-
} catch {}
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Close the held descriptor. Safe to call repeatedly and after a write
|
|
107
|
-
* failure. Optional for correctness (writeSync flushes immediately and the
|
|
108
|
-
* OS closes fds at process exit), but lets a long-lived host release the
|
|
109
|
-
* handle deterministically on shutdown.
|
|
110
|
-
*/
|
|
111
|
-
close() {
|
|
112
|
-
this.closeFd();
|
|
113
|
-
}
|
|
114
|
-
log(logObj, _ctx) {
|
|
115
|
-
if (!ALLOWED_TYPES.has(logObj.type)) return;
|
|
116
|
-
const key = makeDedupeKey(logObj);
|
|
117
|
-
if (this.seen.has(key)) return;
|
|
118
|
-
if (this.seen.size >= DEDUP_MAX) this.seen.clear();
|
|
119
|
-
this.seen.add(key);
|
|
120
|
-
const line = formatLogLine(logObj);
|
|
121
|
-
this.bytesSinceCheck += line.length;
|
|
122
|
-
if (this.bytesSinceCheck >= FileLogReporter.ROTATE_CHECK_BYTES) {
|
|
123
|
-
this.rotateIfNeeded();
|
|
124
|
-
this.bytesSinceCheck = 0;
|
|
125
|
-
}
|
|
126
|
-
const fd = this.ensureFd();
|
|
127
|
-
if (fd === void 0) return;
|
|
128
|
-
try {
|
|
129
|
-
fs.writeSync(fd, line);
|
|
130
|
-
} catch {
|
|
131
|
-
this.closeFd();
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
const nullStream = new Writable({ write(_chunk, _encoding, cb) {
|
|
136
|
-
cb();
|
|
137
|
-
} });
|
|
138
|
-
/**
|
|
139
|
-
* Switch consola to file-only mode for TUI sessions.
|
|
140
|
-
* Removes the terminal reporter and installs a file reporter that
|
|
141
|
-
* persists errors and warnings to disk with dedup and credential scrubbing.
|
|
142
|
-
*
|
|
143
|
-
* Also sinks consola's stdout/stderr streams as belt-and-suspenders:
|
|
144
|
-
* even if a terminal reporter is re-added, it cannot write to the terminal.
|
|
145
|
-
* Crash handlers that call process.stderr.write() directly are unaffected.
|
|
146
|
-
* FileLogReporter uses fs.writeSync() directly and is also unaffected.
|
|
147
|
-
*/
|
|
148
|
-
function enableFileLogging() {
|
|
149
|
-
const reporter = new FileLogReporter(PATHS.ERROR_LOG_PATH);
|
|
150
|
-
consola.options.throttle = 0;
|
|
151
|
-
consola.setReporters([reporter]);
|
|
152
|
-
consola.options.stdout = nullStream;
|
|
153
|
-
consola.options.stderr = nullStream;
|
|
154
|
-
}
|
|
155
|
-
//#endregion
|
|
156
|
-
export { enableFileLogging as t };
|
|
157
|
-
|
|
158
|
-
//# sourceMappingURL=file-log-reporter-vI8qCFNM.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-log-reporter-vI8qCFNM.js","names":[],"sources":["../src/lib/file-log-reporter.ts"],"sourcesContent":["import fs from \"node:fs\"\nimport { Writable } from \"node:stream\"\n\nimport consola from \"consola\"\nimport type { ConsolaOptions, ConsolaReporter, LogObject } from \"consola\"\n\nimport { PATHS } from \"~/lib/paths\"\n\nconst MAX_LOG_BYTES = 1024 * 1024 // 1 MB\nconst DEDUP_MAX = 1000\nconst ARG_MAX_LEN = 2048\nconst DEDUP_KEY_MAX_LEN = 200\n\nconst CREDENTIAL_RE =\n /\\b(eyJ[A-Za-z0-9_-]{20,}(?:\\.[A-Za-z0-9_-]+){0,2}|gh[opsu]_[A-Za-z0-9_]{20,}|Bearer\\s+\\S{20,})\\b/g\n\nconst ALLOWED_TYPES = new Set([\"fatal\", \"error\", \"warn\"])\n\nfunction sanitize(line: string): string {\n return line.replace(CREDENTIAL_RE, \"[REDACTED]\")\n}\n\nfunction serializeArg(arg: unknown): string {\n if (typeof arg === \"string\") return arg\n if (arg instanceof Error) {\n const parts = [arg.message]\n if (arg.stack) parts.push(arg.stack)\n return parts.join(\"\\n\")\n }\n return String(arg)\n}\n\nfunction formatLogLine(logObj: LogObject): string {\n const ts = logObj.date.toISOString()\n const level = (logObj.type ?? \"error\").toUpperCase()\n const message = logObj.args\n .map((a) => {\n const s = serializeArg(a)\n return s.length > ARG_MAX_LEN ? s.slice(0, ARG_MAX_LEN) + \"…\" : s\n })\n .join(\" \")\n .replace(/\\r\\n|\\r|\\n/g, \"\\\\n\")\n\n return sanitize(`${ts} [${level}] ${message}\\n`)\n}\n\nfunction makeDedupeKey(logObj: LogObject): string {\n const firstArg =\n logObj.args.length > 0 ? serializeArg(logObj.args[0]) : \"\"\n const key = `${logObj.type}:${firstArg}`\n return key.length > DEDUP_KEY_MAX_LEN\n ? key.slice(0, DEDUP_KEY_MAX_LEN)\n : key\n}\n\n/**\n * Construction-time rotation: rename the log aside if it's already over the\n * cap before we start appending. Runs with no descriptor held (the instance\n * fd is opened lazily on the first `log()`), so a plain path stat + rename is\n * correct here. The per-`log()` ceiling check lives in `rotateIfNeeded()`.\n */\nfunction rotateAtStartup(filePath: string): void {\n let size: number\n try {\n size = fs.statSync(filePath).size\n } catch {\n return // file does not exist\n }\n if (size <= MAX_LOG_BYTES) return\n\n try {\n fs.renameSync(filePath, filePath + \".1\")\n } catch {\n // best-effort: if rename fails, continue with the existing file\n }\n}\n\nexport class FileLogReporter implements ConsolaReporter {\n private readonly filePath: string\n private readonly seen = new Set<string>()\n // Approximate bytes written since the last rotation check. We use a\n // conservative trigger threshold (half the max) so a burst of large\n // lines between checks never grows the file by more than ~2x the cap.\n // The stat inside rotateIfNeeded confirms the real size before rotating.\n private bytesSinceCheck = 0\n private static readonly ROTATE_CHECK_BYTES = MAX_LOG_BYTES / 2\n\n // Persistent append descriptor. Opened lazily on the first write and held\n // open for the reporter's lifetime — a daemon writing thousands of warn /\n // error lines must NOT pay an openSync + closeSync syscall pair per line\n // (that was ~0.4 ms/line on Windows NTFS, i.e. seconds per MB). It is\n // closed only across a rotation (so the rename can succeed — Windows\n // refuses to rename a file with an open handle) and on an explicit\n // close(); the next write reopens the fresh file.\n private fd: number | undefined\n\n constructor(filePath: string) {\n this.filePath = filePath\n rotateAtStartup(filePath)\n }\n\n private ensureFd(): number | undefined {\n if (this.fd !== undefined) return this.fd\n try {\n this.fd = fs.openSync(this.filePath, \"a\", 0o600)\n } catch {\n // Path unwritable (e.g. it's a directory, or perms) — stay closed and\n // drop lines silently. Cannot log a logging failure.\n this.fd = undefined\n }\n return this.fd\n }\n\n private closeFd(): void {\n if (this.fd === undefined) return\n try {\n fs.closeSync(this.fd)\n } catch {\n // already closed / unwritable — nothing to do\n }\n this.fd = undefined\n }\n\n /**\n * Enforce the MAX_LOG_BYTES ceiling. Sizes the LIVE file (fstat on the open\n * fd when we hold one — no path race — else a path stat), and on overflow\n * CLOSES the fd before renaming. Closing first is load-bearing on Windows\n * (renaming a file with an open handle fails with EBUSY/EPERM) and correct\n * on POSIX too (a held append-fd would otherwise keep writing into the\n * renamed `.1` inode). The fd is left closed so the next write reopens the\n * freshly-created file.\n */\n private rotateIfNeeded(): void {\n let size: number\n try {\n size =\n this.fd !== undefined\n ? fs.fstatSync(this.fd).size\n : fs.statSync(this.filePath).size\n } catch {\n return // file does not exist / fd invalid\n }\n if (size <= MAX_LOG_BYTES) return\n\n this.closeFd()\n try {\n fs.renameSync(this.filePath, this.filePath + \".1\")\n } catch {\n // best-effort: if rename fails, continue appending to the existing file\n }\n }\n\n /**\n * Close the held descriptor. Safe to call repeatedly and after a write\n * failure. Optional for correctness (writeSync flushes immediately and the\n * OS closes fds at process exit), but lets a long-lived host release the\n * handle deterministically on shutdown.\n */\n close(): void {\n this.closeFd()\n }\n\n log(logObj: LogObject, _ctx: { options: ConsolaOptions }): void {\n if (!ALLOWED_TYPES.has(logObj.type)) return\n\n const key = makeDedupeKey(logObj)\n if (this.seen.has(key)) return\n\n if (this.seen.size >= DEDUP_MAX) this.seen.clear()\n this.seen.add(key)\n\n const line = formatLogLine(logObj)\n\n // Periodic rotation check: after every ROTATE_CHECK_BYTES written since\n // the last check, enforce the MAX_LOG_BYTES ceiling from inside the hot\n // path. The fstat/stat only runs when the threshold is exceeded, so this\n // adds at most one stat per 512 KB of output.\n //\n // Concurrency: log() is synchronous (the writeSync below holds the event\n // loop), so two calls can't interleave and the bytesSinceCheck counter is\n // safe without a mutex.\n this.bytesSinceCheck += line.length\n if (this.bytesSinceCheck >= FileLogReporter.ROTATE_CHECK_BYTES) {\n this.rotateIfNeeded()\n this.bytesSinceCheck = 0\n }\n\n // Write through the persistent append fd (opened lazily / reopened after\n // a rotation). On any write error, close + drop the fd so a transient\n // failure (ENOSPC, the file removed out from under us) neither wedges\n // logging permanently nor leaks the descriptor — the next call reopens.\n const fd = this.ensureFd()\n if (fd === undefined) return\n try {\n fs.writeSync(fd, line)\n } catch {\n this.closeFd()\n }\n }\n}\n\nconst nullStream = new Writable({ write(_chunk, _encoding, cb) { cb() } })\n\n/**\n * Switch consola to file-only mode for TUI sessions.\n * Removes the terminal reporter and installs a file reporter that\n * persists errors and warnings to disk with dedup and credential scrubbing.\n *\n * Also sinks consola's stdout/stderr streams as belt-and-suspenders:\n * even if a terminal reporter is re-added, it cannot write to the terminal.\n * Crash handlers that call process.stderr.write() directly are unaffected.\n * FileLogReporter uses fs.writeSync() directly and is also unaffected.\n */\nexport function enableFileLogging(): void {\n const reporter = new FileLogReporter(PATHS.ERROR_LOG_PATH)\n consola.options.throttle = 0 // disable built-in dedup\n consola.setReporters([reporter])\n consola.options.stdout = nullStream as unknown as typeof process.stdout\n consola.options.stderr = nullStream as unknown as typeof process.stderr\n}\n"],"mappings":"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"}
|