@tom2012/cc-web 2026.4.22-a → 2026.4.22-c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/backend/dist/adapters/claude/usage.d.ts +29 -0
- package/backend/dist/adapters/claude/usage.d.ts.map +1 -0
- package/backend/dist/adapters/claude/usage.js +202 -0
- package/backend/dist/adapters/claude/usage.js.map +1 -0
- package/backend/dist/adapters/claude-adapter.d.ts +1 -0
- package/backend/dist/adapters/claude-adapter.d.ts.map +1 -1
- package/backend/dist/adapters/claude-adapter.js +7 -4
- package/backend/dist/adapters/claude-adapter.js.map +1 -1
- package/backend/dist/adapters/codex-adapter.d.ts +18 -1
- package/backend/dist/adapters/codex-adapter.d.ts.map +1 -1
- package/backend/dist/adapters/codex-adapter.js +163 -20
- package/backend/dist/adapters/codex-adapter.js.map +1 -1
- package/backend/dist/adapters/gemini-adapter.d.ts +1 -0
- package/backend/dist/adapters/gemini-adapter.d.ts.map +1 -1
- package/backend/dist/adapters/gemini-adapter.js +1 -0
- package/backend/dist/adapters/gemini-adapter.js.map +1 -1
- package/backend/dist/adapters/opencode-adapter.d.ts +1 -0
- package/backend/dist/adapters/opencode-adapter.d.ts.map +1 -1
- package/backend/dist/adapters/opencode-adapter.js +1 -0
- package/backend/dist/adapters/opencode-adapter.js.map +1 -1
- package/backend/dist/adapters/qwen-adapter.d.ts +1 -0
- package/backend/dist/adapters/qwen-adapter.d.ts.map +1 -1
- package/backend/dist/adapters/qwen-adapter.js +1 -0
- package/backend/dist/adapters/qwen-adapter.js.map +1 -1
- package/backend/dist/adapters/terminal-adapter.d.ts +1 -0
- package/backend/dist/adapters/terminal-adapter.d.ts.map +1 -1
- package/backend/dist/adapters/terminal-adapter.js +1 -0
- package/backend/dist/adapters/terminal-adapter.js.map +1 -1
- package/backend/dist/adapters/types.d.ts +10 -0
- package/backend/dist/adapters/types.d.ts.map +1 -1
- package/backend/dist/agent-prompts.d.ts +14 -10
- package/backend/dist/agent-prompts.d.ts.map +1 -1
- package/backend/dist/agent-prompts.js +51 -21
- package/backend/dist/agent-prompts.js.map +1 -1
- package/backend/dist/approval-manager.d.ts +10 -0
- package/backend/dist/approval-manager.d.ts.map +1 -1
- package/backend/dist/approval-manager.js +14 -2
- package/backend/dist/approval-manager.js.map +1 -1
- package/backend/dist/auth.d.ts.map +1 -1
- package/backend/dist/auth.js +15 -2
- package/backend/dist/auth.js.map +1 -1
- package/backend/dist/config.d.ts.map +1 -1
- package/backend/dist/config.js +3 -1
- package/backend/dist/config.js.map +1 -1
- package/backend/dist/hooks-manager.d.ts +9 -0
- package/backend/dist/hooks-manager.d.ts.map +1 -1
- package/backend/dist/hooks-manager.js +14 -3
- package/backend/dist/hooks-manager.js.map +1 -1
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +49 -13
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/logger.d.ts +47 -0
- package/backend/dist/logger.d.ts.map +1 -0
- package/backend/dist/logger.js +355 -0
- package/backend/dist/logger.js.map +1 -0
- package/backend/dist/memory-prompts.d.ts +3 -2
- package/backend/dist/memory-prompts.d.ts.map +1 -1
- package/backend/dist/memory-prompts.js +10 -10
- package/backend/dist/memory-prompts.js.map +1 -1
- package/backend/dist/middleware/request-log.d.ts +3 -0
- package/backend/dist/middleware/request-log.d.ts.map +1 -0
- package/backend/dist/middleware/request-log.js +97 -0
- package/backend/dist/middleware/request-log.js.map +1 -0
- package/backend/dist/notify-service.d.ts.map +1 -1
- package/backend/dist/notify-service.js +3 -1
- package/backend/dist/notify-service.js.map +1 -1
- package/backend/dist/plugin-manager.d.ts.map +1 -1
- package/backend/dist/plugin-manager.js +8 -6
- package/backend/dist/plugin-manager.js.map +1 -1
- package/backend/dist/routes/agent-prompts.d.ts.map +1 -1
- package/backend/dist/routes/agent-prompts.js +28 -26
- package/backend/dist/routes/agent-prompts.js.map +1 -1
- package/backend/dist/routes/auth.d.ts.map +1 -1
- package/backend/dist/routes/auth.js +3 -1
- package/backend/dist/routes/auth.js.map +1 -1
- package/backend/dist/routes/hooks.d.ts.map +1 -1
- package/backend/dist/routes/hooks.js +19 -0
- package/backend/dist/routes/hooks.js.map +1 -1
- package/backend/dist/routes/memory-prompts.d.ts.map +1 -1
- package/backend/dist/routes/memory-prompts.js +13 -11
- package/backend/dist/routes/memory-prompts.js.map +1 -1
- package/backend/dist/routes/projects.d.ts.map +1 -1
- package/backend/dist/routes/projects.js +12 -3
- package/backend/dist/routes/projects.js.map +1 -1
- package/backend/dist/routes/skillhub.d.ts.map +1 -1
- package/backend/dist/routes/skillhub.js +4 -2
- package/backend/dist/routes/skillhub.js.map +1 -1
- package/backend/dist/routes/update.d.ts.map +1 -1
- package/backend/dist/routes/update.js +24 -6
- package/backend/dist/routes/update.js.map +1 -1
- package/backend/dist/session-manager.d.ts.map +1 -1
- package/backend/dist/session-manager.js +66 -16
- package/backend/dist/session-manager.js.map +1 -1
- package/backend/dist/sync-scheduler.d.ts.map +1 -1
- package/backend/dist/sync-scheduler.js +41 -2
- package/backend/dist/sync-scheduler.js.map +1 -1
- package/backend/dist/sync-service.d.ts +3 -1
- package/backend/dist/sync-service.d.ts.map +1 -1
- package/backend/dist/sync-service.js +18 -6
- package/backend/dist/sync-service.js.map +1 -1
- package/backend/dist/terminal-manager.d.ts +4 -1
- package/backend/dist/terminal-manager.d.ts.map +1 -1
- package/backend/dist/terminal-manager.js +31 -8
- package/backend/dist/terminal-manager.js.map +1 -1
- package/backend/dist/usage-terminal.d.ts.map +1 -1
- package/backend/dist/usage-terminal.js +5 -3
- package/backend/dist/usage-terminal.js.map +1 -1
- package/backend/package-lock.json +153 -0
- package/backend/package.json +2 -0
- package/bin/ccweb.js +3 -1
- package/frontend/dist/assets/AssistantMessageContent-D9UiFFE2.js +13 -0
- package/frontend/dist/assets/{GraphPreview-oSG5zw4O.js → GraphPreview-MfS2qFbu.js} +1 -1
- package/frontend/dist/assets/{MobilePage-DNkQnE7-.js → MobilePage-C32pb6m8.js} +3 -3
- package/frontend/dist/assets/{OfficePreview-C5YVCs_i.js → OfficePreview-BTOmTUcw.js} +2 -2
- package/frontend/dist/assets/ProjectPage-Dhxpa8db.js +26 -0
- package/frontend/dist/assets/{SettingsPage-BBVvLPDr.js → SettingsPage-ChzjDTNX.js} +2 -2
- package/frontend/dist/assets/{SkillHubPage-fxW189Ca.js → SkillHubPage-DKtZOrUk.js} +3 -3
- package/frontend/dist/assets/{chevron-down-DwQtRZFp.js → chevron-down-CDoIuDnn.js} +1 -1
- package/frontend/dist/assets/{chevron-up-B43U8MiF.js → chevron-up-jGWs6GMh.js} +1 -1
- package/frontend/dist/assets/index-CPwZI53Z.js +75 -0
- package/frontend/dist/assets/{index-DHlRaHat.js → index-D7HRanYr.js} +1 -1
- package/frontend/dist/assets/{index-CqX-dw66.js → index-DqgIuQ6k.js} +1 -1
- package/frontend/dist/assets/index-t3Zp9UzI.css +1 -0
- package/frontend/dist/assets/{jszip.min-COVqv5KF.js → jszip.min-BRHGpQBe.js} +1 -1
- package/frontend/dist/assets/{search-Bg2yBV9K.js → search-DM1GyKez.js} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/AssistantMessageContent-Cbd8kEKb.js +0 -13
- package/frontend/dist/assets/ProjectPage-BI-45S2D.js +0 -26
- package/frontend/dist/assets/index-CjKxGpPA.css +0 -1
- package/frontend/dist/assets/index-CjiPKISh.js +0 -75
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* ccweb 结构化日志(pino + pino-roll + ALS)
|
|
4
|
+
*
|
|
5
|
+
* === 红线(hard rules;违反视同引入安全 bug) ===
|
|
6
|
+
* 1. PTY 字节流(input 或 output)永不入日志,无论截断、preview、还是 hex。
|
|
7
|
+
* terminal-manager.writeRaw / xterm output 都在此范围。理由:用户在 Claude TUI
|
|
8
|
+
* 粘贴的可能是 API key / token / 密码,PTY 字节流是"用户秘密污染"的。
|
|
9
|
+
* 2. 聊天消息 body 永不整段入日志;仅 { len, preview: text.slice(0, 80) }。
|
|
10
|
+
* 3. 文件内容永不入日志;仅 { path, size }。
|
|
11
|
+
* 4. REDACT_KEYS 白名单外的可疑字段按 "宁愿 redact 不冒险" 处理。
|
|
12
|
+
*
|
|
13
|
+
* === 用法 ===
|
|
14
|
+
* 启动时: await initLogger(); installFatalHandlers();
|
|
15
|
+
* 模块: const log = modLogger('terminal'); log.info({ projectId }, 'started');
|
|
16
|
+
* HTTP: als.run({ reqId, user }, () => next()) —— middleware 里一行,下游自动带
|
|
17
|
+
* 子进程: 子进程 runId 由调用方生成并塞进 mixin(见 sync / update 模块)
|
|
18
|
+
* 退出: SIGTERM 走 flushLogger() + server.close() + process.exit(0)
|
|
19
|
+
* uncaught 异常由 installFatalHandlers 接管,保证 rollStream.flushSync 后才退
|
|
20
|
+
*
|
|
21
|
+
* === 运行期 toggle ===
|
|
22
|
+
* kill -USR1 $(cat ~/.ccweb/ccweb.pid) 在 info / debug 之间切换级别,无需重启
|
|
23
|
+
*/
|
|
24
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
27
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
28
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
29
|
+
}
|
|
30
|
+
Object.defineProperty(o, k2, desc);
|
|
31
|
+
}) : (function(o, m, k, k2) {
|
|
32
|
+
if (k2 === undefined) k2 = k;
|
|
33
|
+
o[k2] = m[k];
|
|
34
|
+
}));
|
|
35
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
36
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
37
|
+
}) : function(o, v) {
|
|
38
|
+
o["default"] = v;
|
|
39
|
+
});
|
|
40
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
41
|
+
var ownKeys = function(o) {
|
|
42
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
43
|
+
var ar = [];
|
|
44
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
45
|
+
return ar;
|
|
46
|
+
};
|
|
47
|
+
return ownKeys(o);
|
|
48
|
+
};
|
|
49
|
+
return function (mod) {
|
|
50
|
+
if (mod && mod.__esModule) return mod;
|
|
51
|
+
var result = {};
|
|
52
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
53
|
+
__setModuleDefault(result, mod);
|
|
54
|
+
return result;
|
|
55
|
+
};
|
|
56
|
+
})();
|
|
57
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
58
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
59
|
+
};
|
|
60
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
61
|
+
exports.als = void 0;
|
|
62
|
+
exports.runWithContext = runWithContext;
|
|
63
|
+
exports.initLogger = initLogger;
|
|
64
|
+
exports.getLogger = getLogger;
|
|
65
|
+
exports.modLogger = modLogger;
|
|
66
|
+
exports.installFatalHandlers = installFatalHandlers;
|
|
67
|
+
exports.flushLogger = flushLogger;
|
|
68
|
+
const pino_1 = __importDefault(require("pino"));
|
|
69
|
+
const pino_roll_1 = __importDefault(require("pino-roll"));
|
|
70
|
+
const async_hooks_1 = require("async_hooks");
|
|
71
|
+
const path = __importStar(require("path"));
|
|
72
|
+
const fs = __importStar(require("fs"));
|
|
73
|
+
const os = __importStar(require("os"));
|
|
74
|
+
// ────────────────── 常量 ──────────────────
|
|
75
|
+
const LOGS_DIR = path.join(os.homedir(), '.ccweb', 'logs');
|
|
76
|
+
const VERSION = (() => {
|
|
77
|
+
try {
|
|
78
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf-8'));
|
|
79
|
+
return `v${pkg.version}`;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return 'v?';
|
|
83
|
+
}
|
|
84
|
+
})();
|
|
85
|
+
const DEFAULT_MAX_MB = parseInt(process.env.CCWEB_LOG_MAX_MB_PER_DAY || '20', 10);
|
|
86
|
+
const DEFAULT_RETAIN = parseInt(process.env.CCWEB_LOG_RETAIN_DAYS || '7', 10);
|
|
87
|
+
const DEFAULT_LEVEL = process.env.CCWEB_LOG_LEVEL || 'info';
|
|
88
|
+
/** Fields whose values are always replaced with '***'. */
|
|
89
|
+
const REDACT_KEYS = [
|
|
90
|
+
'password',
|
|
91
|
+
'passwordHash',
|
|
92
|
+
'token',
|
|
93
|
+
'jwtSecret',
|
|
94
|
+
'approvalSecret',
|
|
95
|
+
'authorization',
|
|
96
|
+
'apiKey',
|
|
97
|
+
'SSHPASS',
|
|
98
|
+
'hubToken',
|
|
99
|
+
'publishToken',
|
|
100
|
+
'oauthToken',
|
|
101
|
+
'accessToken',
|
|
102
|
+
'refreshToken',
|
|
103
|
+
'*.password',
|
|
104
|
+
'*.token',
|
|
105
|
+
'*.secret',
|
|
106
|
+
'req.headers.authorization',
|
|
107
|
+
'req.headers.cookie',
|
|
108
|
+
];
|
|
109
|
+
/**
|
|
110
|
+
* Regex redactors applied to every string value we encounter — AND to nested
|
|
111
|
+
* err.message / err.stack (pino's built-in err serializer unpacks Error into
|
|
112
|
+
* `{type, message, stack}`, which bypasses both REDACT_KEYS and the shallow
|
|
113
|
+
* top-level sweep unless we handle err explicitly).
|
|
114
|
+
*
|
|
115
|
+
* Threshold for hex redaction is 64 chars (SHA-256 / generated 32-byte hex
|
|
116
|
+
* secrets). 40-hex would false-positive on git SHAs and unlucky directory
|
|
117
|
+
* names (reviewer C2).
|
|
118
|
+
*
|
|
119
|
+
* GitHub PAT prefixes cover ghp_/gho_/ghu_/ghs_/ghr_ (legacy) and
|
|
120
|
+
* github_pat_ (fine-grained). skillhub routes user PATs through this
|
|
121
|
+
* logger when ops throw (reviewer N6 — zero-cost defence).
|
|
122
|
+
*/
|
|
123
|
+
const REGEX_REDACTORS = [
|
|
124
|
+
[/Bearer [A-Za-z0-9._\-]+/g, 'Bearer ***'],
|
|
125
|
+
[/npm_[A-Za-z0-9]{20,}/g, 'npm_***'],
|
|
126
|
+
[/\b(ghp_|gho_|ghu_|ghs_|ghr_|github_pat_)[A-Za-z0-9_]{20,}\b/g, 'gh_***'],
|
|
127
|
+
[/\b[a-f0-9]{64,}\b/gi, 'hex:***'],
|
|
128
|
+
];
|
|
129
|
+
function redactString(s) {
|
|
130
|
+
let out = s;
|
|
131
|
+
for (const [re, rep] of REGEX_REDACTORS)
|
|
132
|
+
out = out.replace(re, rep);
|
|
133
|
+
return out;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Recursively redact message/stack along the `err.cause` chain.
|
|
137
|
+
*
|
|
138
|
+
* Reviewer Critical #1: pino's err serializer expands `{cause}` into its own
|
|
139
|
+
* nested `{type, message, stack}` object in the final output; the parent's
|
|
140
|
+
* `err.stack` also contains a "Caused by:" block with the child stack joined.
|
|
141
|
+
* Single-level redact (obj.err.message + obj.err.stack) misses cause.message
|
|
142
|
+
* / cause.stack as separate fields. Depth cap 3 prevents infinite loops on
|
|
143
|
+
* self-referential causes and caps CPU on malicious err graphs.
|
|
144
|
+
*/
|
|
145
|
+
function redactErrDeep(err, depth = 0) {
|
|
146
|
+
if (!err || typeof err !== 'object' || depth > 3)
|
|
147
|
+
return;
|
|
148
|
+
const e = err;
|
|
149
|
+
if (typeof e.message === 'string')
|
|
150
|
+
e.message = redactString(e.message);
|
|
151
|
+
if (typeof e.stack === 'string')
|
|
152
|
+
e.stack = redactString(e.stack);
|
|
153
|
+
if (e.cause)
|
|
154
|
+
redactErrDeep(e.cause, depth + 1);
|
|
155
|
+
}
|
|
156
|
+
exports.als = new async_hooks_1.AsyncLocalStorage();
|
|
157
|
+
function runWithContext(ctx, fn) {
|
|
158
|
+
return exports.als.run(ctx, fn);
|
|
159
|
+
}
|
|
160
|
+
// ────────────────── Logger 实例(延迟初始化)──────────────────
|
|
161
|
+
let logger = null;
|
|
162
|
+
// pino-roll returns a SonicBoom stream; we hold it for flushSync on fatal exit.
|
|
163
|
+
let rollStream = null;
|
|
164
|
+
function ensureDir() {
|
|
165
|
+
try {
|
|
166
|
+
fs.mkdirSync(LOGS_DIR, { mode: 0o700, recursive: true });
|
|
167
|
+
// chmod even if dir existed (recreated between versions)
|
|
168
|
+
fs.chmodSync(LOGS_DIR, 0o700);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
/* best effort */
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async function initLogger() {
|
|
175
|
+
if (logger)
|
|
176
|
+
return logger;
|
|
177
|
+
ensureDir();
|
|
178
|
+
rollStream = await (0, pino_roll_1.default)({
|
|
179
|
+
file: path.join(LOGS_DIR, 'ccweb'),
|
|
180
|
+
dateFormat: 'yyyy-MM-dd',
|
|
181
|
+
extension: '.log',
|
|
182
|
+
frequency: 'daily',
|
|
183
|
+
size: `${DEFAULT_MAX_MB}m`,
|
|
184
|
+
limit: { count: DEFAULT_RETAIN },
|
|
185
|
+
mkdir: true,
|
|
186
|
+
// sonic-boom passthrough: create log files 0600 (owner-only)
|
|
187
|
+
mode: 0o600,
|
|
188
|
+
});
|
|
189
|
+
logger = (0, pino_1.default)({
|
|
190
|
+
level: DEFAULT_LEVEL,
|
|
191
|
+
base: { ver: VERSION, pid: process.pid },
|
|
192
|
+
timestamp: pino_1.default.stdTimeFunctions.isoTime,
|
|
193
|
+
messageKey: 'msg',
|
|
194
|
+
errorKey: 'err',
|
|
195
|
+
formatters: {
|
|
196
|
+
level: (label) => ({ lvl: label }),
|
|
197
|
+
log: (obj) => {
|
|
198
|
+
// ALS injection: HTTP/WS handlers put reqId/user into ALS;
|
|
199
|
+
// any log event downstream in the same async chain auto-tags.
|
|
200
|
+
const ctx = exports.als.getStore();
|
|
201
|
+
if (ctx) {
|
|
202
|
+
if (ctx.reqId && !obj.reqId)
|
|
203
|
+
obj.reqId = ctx.reqId;
|
|
204
|
+
if (ctx.user && !obj.user)
|
|
205
|
+
obj.user = ctx.user;
|
|
206
|
+
if (ctx.projectId && !obj.projectId)
|
|
207
|
+
obj.projectId = ctx.projectId;
|
|
208
|
+
if (ctx.wsId && !obj.wsId)
|
|
209
|
+
obj.wsId = ctx.wsId;
|
|
210
|
+
if (ctx.runId && !obj.runId)
|
|
211
|
+
obj.runId = ctx.runId;
|
|
212
|
+
}
|
|
213
|
+
// Shallow regex sweep over string values.
|
|
214
|
+
for (const k of Object.keys(obj)) {
|
|
215
|
+
const v = obj[k];
|
|
216
|
+
if (typeof v === 'string')
|
|
217
|
+
obj[k] = redactString(v);
|
|
218
|
+
}
|
|
219
|
+
// Deep sweep on serialized Error along the `cause` chain.
|
|
220
|
+
// pino's err serializer expands nested err.cause into its own
|
|
221
|
+
// {type, message, stack} sub-object; the parent stack also
|
|
222
|
+
// contains a "Caused by:" block. Single-level redact misses
|
|
223
|
+
// cause.message / cause.stack as separate fields.
|
|
224
|
+
// Reviewer C1 + new: undici (node fetch) errors surface TLS /
|
|
225
|
+
// DNS cause with stack occasionally bearing cert fingerprints /
|
|
226
|
+
// cookie headers / token fragments. Depth 3 caps self-ref loops.
|
|
227
|
+
if (obj.err)
|
|
228
|
+
redactErrDeep(obj.err);
|
|
229
|
+
return obj;
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
redact: {
|
|
233
|
+
paths: REDACT_KEYS,
|
|
234
|
+
censor: '***',
|
|
235
|
+
},
|
|
236
|
+
}, rollStream);
|
|
237
|
+
// Runtime level toggle without restart.
|
|
238
|
+
process.on('SIGUSR1', () => {
|
|
239
|
+
if (!logger)
|
|
240
|
+
return;
|
|
241
|
+
logger.level = logger.level === 'debug' ? 'info' : 'debug';
|
|
242
|
+
logger.info({ mod: 'server', level: logger.level }, 'log level toggled');
|
|
243
|
+
});
|
|
244
|
+
return logger;
|
|
245
|
+
}
|
|
246
|
+
/** Get the base logger. Caller MUST initLogger() first. */
|
|
247
|
+
function getLogger() {
|
|
248
|
+
if (!logger)
|
|
249
|
+
throw new Error('logger not initialized — call initLogger() first');
|
|
250
|
+
return logger;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Module-scoped child logger.
|
|
254
|
+
*
|
|
255
|
+
* Safe to call at module top level: returns a lazy Proxy that defers the
|
|
256
|
+
* actual `logger.child({ mod })` call until the first `.info/.warn/...`.
|
|
257
|
+
* This lets any module do `const log = modLogger('x')` regardless of
|
|
258
|
+
* import order relative to `initLogger()`.
|
|
259
|
+
*
|
|
260
|
+
* If called after init, child is created eagerly (no Proxy cost).
|
|
261
|
+
*
|
|
262
|
+
* Pre-init calls fall back to a console-shim — bootstrap-phase events
|
|
263
|
+
* still surface via daemon stdout → `~/.ccweb/ccweb.log` (plan §11). Once
|
|
264
|
+
* pino is ready, the Proxy swaps to the real child for the next call.
|
|
265
|
+
*/
|
|
266
|
+
function modLogger(mod) {
|
|
267
|
+
if (logger)
|
|
268
|
+
return logger.child({ mod });
|
|
269
|
+
// Pre-init fallback: shim mapping pino-style calls to console.
|
|
270
|
+
// Never throws — bootstrap code does not break if it logs before pino.
|
|
271
|
+
const bootstrapShim = {
|
|
272
|
+
fatal: (obj, msg) => console.error(`[boot ${mod}] fatal`, msg ?? '', obj),
|
|
273
|
+
error: (obj, msg) => console.error(`[boot ${mod}] ${msg ?? ''}`, obj),
|
|
274
|
+
warn: (obj, msg) => console.warn(`[boot ${mod}] ${msg ?? ''}`, obj),
|
|
275
|
+
info: (obj, msg) => console.log(`[boot ${mod}] ${msg ?? ''}`, obj),
|
|
276
|
+
debug: () => { },
|
|
277
|
+
trace: () => { },
|
|
278
|
+
child: () => bootstrapShim,
|
|
279
|
+
};
|
|
280
|
+
let cached = null;
|
|
281
|
+
const resolve = () => {
|
|
282
|
+
if (cached)
|
|
283
|
+
return cached;
|
|
284
|
+
if (!logger)
|
|
285
|
+
return bootstrapShim; // still pre-init — route to console
|
|
286
|
+
cached = logger.child({ mod });
|
|
287
|
+
return cached;
|
|
288
|
+
};
|
|
289
|
+
// Proxy every access through resolve(). Bind functions back to the target
|
|
290
|
+
// so `this` stays correct on both shim and real child.
|
|
291
|
+
return new Proxy({}, {
|
|
292
|
+
get(_target, prop) {
|
|
293
|
+
const target = resolve();
|
|
294
|
+
const val = target[prop];
|
|
295
|
+
return typeof val === 'function' ? val.bind(target) : val;
|
|
296
|
+
},
|
|
297
|
+
set(_target, prop, value) {
|
|
298
|
+
const target = resolve();
|
|
299
|
+
target[prop] = value;
|
|
300
|
+
return true;
|
|
301
|
+
},
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
// ────────────────── Fatal handlers ──────────────────
|
|
305
|
+
/**
|
|
306
|
+
* Install process-level uncaughtException / unhandledRejection handlers
|
|
307
|
+
* that write the fatal record, then call flushSync on the pino-roll stream
|
|
308
|
+
* (sonic-boom) before exit. Without the flushSync, sonic-boom's async buffer
|
|
309
|
+
* would drop the very stack trace we most need to investigate
|
|
310
|
+
* (reviewer Critical #1).
|
|
311
|
+
*
|
|
312
|
+
* Note: pino v10 removed `pino.final` — the recommended pattern is direct
|
|
313
|
+
* flushSync on the sonic-boom destination (pino-roll returns a SonicBoom).
|
|
314
|
+
*/
|
|
315
|
+
function installFatalHandlers() {
|
|
316
|
+
const base = logger;
|
|
317
|
+
if (!base)
|
|
318
|
+
throw new Error('logger not initialized');
|
|
319
|
+
const handler = (err, origin) => {
|
|
320
|
+
try {
|
|
321
|
+
base.fatal({ err, origin, mod: 'server' }, 'fatal — process exiting');
|
|
322
|
+
}
|
|
323
|
+
catch {
|
|
324
|
+
/* don't let logging fail stop exit */
|
|
325
|
+
}
|
|
326
|
+
try {
|
|
327
|
+
if (rollStream && typeof rollStream.flushSync === 'function') {
|
|
328
|
+
rollStream.flushSync();
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
/* flush best-effort */
|
|
333
|
+
}
|
|
334
|
+
process.exit(1);
|
|
335
|
+
};
|
|
336
|
+
process.on('uncaughtException', (err) => handler(err, 'uncaughtException'));
|
|
337
|
+
process.on('unhandledRejection', (reason) => {
|
|
338
|
+
const err = reason instanceof Error ? reason : new Error(String(reason));
|
|
339
|
+
handler(err, 'unhandledRejection');
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Graceful flush — for SIGTERM / planned shutdown. Non-fatal path.
|
|
344
|
+
* Returns a promise that resolves after pino has flushed.
|
|
345
|
+
*/
|
|
346
|
+
function flushLogger() {
|
|
347
|
+
return new Promise((resolve) => {
|
|
348
|
+
if (!logger) {
|
|
349
|
+
resolve();
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
logger.flush(() => resolve());
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CliTool } from './types';
|
|
1
2
|
/**
|
|
2
3
|
* Memory Prompts — filesystem-backed prompt snippets located at
|
|
3
4
|
* `<project>/.ccweb/memory/*.md`, toggleable into CLAUDE.md with
|
|
@@ -26,7 +27,7 @@ export interface MemoryListResult {
|
|
|
26
27
|
items: MemoryPromptItem[];
|
|
27
28
|
claudeMdLineCount: number;
|
|
28
29
|
}
|
|
29
|
-
export declare function listMemoryPrompts(folderPath: string): MemoryListResult;
|
|
30
|
+
export declare function listMemoryPrompts(folderPath: string, cliTool?: CliTool): MemoryListResult;
|
|
30
31
|
export type ToggleAction = 'insert' | 'remove';
|
|
31
32
|
export interface ToggleResult {
|
|
32
33
|
ok: boolean;
|
|
@@ -35,5 +36,5 @@ export interface ToggleResult {
|
|
|
35
36
|
reason?: string;
|
|
36
37
|
claudeMdLineCount?: number;
|
|
37
38
|
}
|
|
38
|
-
export declare function toggleMemoryPrompt(folderPath: string, filename: string, action: ToggleAction): ToggleResult;
|
|
39
|
+
export declare function toggleMemoryPrompt(folderPath: string, filename: string, action: ToggleAction, cliTool?: CliTool): ToggleResult;
|
|
39
40
|
//# sourceMappingURL=memory-prompts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-prompts.d.ts","sourceRoot":"","sources":["../src/memory-prompts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memory-prompts.d.ts","sourceRoot":"","sources":["../src/memory-prompts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AA+BD;6EAC6E;AAC7E,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGnD;AAID,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,gBAAgB,CA8BzF;AAID,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,OAAO,GAChB,YAAY,CAiEd"}
|
|
@@ -70,17 +70,17 @@ function lineCountOf(content) {
|
|
|
70
70
|
return 0;
|
|
71
71
|
return content.replace(/\n$/, '').split('\n').length;
|
|
72
72
|
}
|
|
73
|
-
function listMemoryPrompts(folderPath) {
|
|
73
|
+
function listMemoryPrompts(folderPath, cliTool) {
|
|
74
74
|
const dir = memoryDir(folderPath);
|
|
75
75
|
let files = [];
|
|
76
76
|
try {
|
|
77
77
|
files = fs.readdirSync(dir).filter((f) => f.endsWith('.md'));
|
|
78
78
|
}
|
|
79
79
|
catch {
|
|
80
|
-
// dir missing is normal — still return
|
|
81
|
-
return { items: [], claudeMdLineCount: lineCountOf((0, agent_prompts_1.readClaudeMd)(folderPath)) };
|
|
80
|
+
// dir missing is normal — still return instructions file line count
|
|
81
|
+
return { items: [], claudeMdLineCount: lineCountOf((0, agent_prompts_1.readClaudeMd)(folderPath, cliTool)) };
|
|
82
82
|
}
|
|
83
|
-
const claudeMd = (0, agent_prompts_1.readClaudeMd)(folderPath);
|
|
83
|
+
const claudeMd = (0, agent_prompts_1.readClaudeMd)(folderPath, cliTool);
|
|
84
84
|
const out = [];
|
|
85
85
|
for (const filename of files) {
|
|
86
86
|
const name = filename.replace(/\.md$/, '');
|
|
@@ -109,7 +109,7 @@ function listMemoryPrompts(folderPath) {
|
|
|
109
109
|
out.sort((a, b) => a.name.localeCompare(b.name));
|
|
110
110
|
return { items: out, claudeMdLineCount: lineCountOf(claudeMd) };
|
|
111
111
|
}
|
|
112
|
-
function toggleMemoryPrompt(folderPath, filename, action) {
|
|
112
|
+
function toggleMemoryPrompt(folderPath, filename, action, cliTool) {
|
|
113
113
|
// Guard filename — reject anything that could escape memory/ via the name.
|
|
114
114
|
if (!filename || filename.includes('/') || filename.includes('\\') || filename.includes('\0')) {
|
|
115
115
|
return { ok: false, changed: false, inserted: false, reason: 'invalid-filename' };
|
|
@@ -119,7 +119,7 @@ function toggleMemoryPrompt(folderPath, filename, action) {
|
|
|
119
119
|
}
|
|
120
120
|
const name = filename.replace(/\.md$/, '');
|
|
121
121
|
const filePath = path.join(memoryDir(folderPath), filename);
|
|
122
|
-
let claudeMd = (0, agent_prompts_1.readClaudeMd)(folderPath);
|
|
122
|
+
let claudeMd = (0, agent_prompts_1.readClaudeMd)(folderPath, cliTool);
|
|
123
123
|
const re = blockRegex(name);
|
|
124
124
|
const currentlyInserted = re.test(claudeMd);
|
|
125
125
|
if (action === 'remove') {
|
|
@@ -129,7 +129,7 @@ function toggleMemoryPrompt(folderPath, filename, action) {
|
|
|
129
129
|
claudeMd = claudeMd.replace(re, '\n\n');
|
|
130
130
|
// Collapse any runs of 3+ blank lines left behind into 2
|
|
131
131
|
claudeMd = claudeMd.replace(/\n{3,}/g, '\n\n');
|
|
132
|
-
(0, agent_prompts_1.writeClaudeMd)(folderPath, claudeMd);
|
|
132
|
+
(0, agent_prompts_1.writeClaudeMd)(folderPath, claudeMd, cliTool);
|
|
133
133
|
return { ok: true, changed: true, inserted: false, claudeMdLineCount: lineCountOf(claudeMd) };
|
|
134
134
|
}
|
|
135
135
|
// Insert (or refresh in place). Symlink guard mirrors `listMemoryPrompts`
|
|
@@ -165,13 +165,13 @@ function toggleMemoryPrompt(folderPath, filename, action) {
|
|
|
165
165
|
// have been edited since last insert).
|
|
166
166
|
claudeMd = claudeMd.replace(re, `\n\n${block}\n\n`);
|
|
167
167
|
claudeMd = claudeMd.replace(/\n{3,}/g, '\n\n');
|
|
168
|
-
(0, agent_prompts_1.writeClaudeMd)(folderPath, claudeMd);
|
|
168
|
+
(0, agent_prompts_1.writeClaudeMd)(folderPath, claudeMd, cliTool);
|
|
169
169
|
return { ok: true, changed: true, inserted: true, reason: 'refreshed', claudeMdLineCount: lineCountOf(claudeMd) };
|
|
170
170
|
}
|
|
171
|
-
// Append with separating blank line if
|
|
171
|
+
// Append with separating blank line if instructions file doesn't already end with one
|
|
172
172
|
const sep = claudeMd.length === 0 ? '' : claudeMd.endsWith('\n\n') ? '' : claudeMd.endsWith('\n') ? '\n' : '\n\n';
|
|
173
173
|
claudeMd = claudeMd + sep + block + '\n';
|
|
174
|
-
(0, agent_prompts_1.writeClaudeMd)(folderPath, claudeMd);
|
|
174
|
+
(0, agent_prompts_1.writeClaudeMd)(folderPath, claudeMd, cliTool);
|
|
175
175
|
return { ok: true, changed: true, inserted: true, claudeMdLineCount: lineCountOf(claudeMd) };
|
|
176
176
|
}
|
|
177
177
|
//# sourceMappingURL=memory-prompts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-prompts.js","sourceRoot":"","sources":["../src/memory-prompts.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"memory-prompts.js","sourceRoot":"","sources":["../src/memory-prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-log.d.ts","sourceRoot":"","sources":["../../src/middleware/request-log.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA4B/D,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAgChF"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Express middleware:生成 reqId,放入 AsyncLocalStorage,log HTTP 请求摘要。
|
|
4
|
+
*
|
|
5
|
+
* 目的:让 HTTP → WS → PTY 的因果链可通过 reqId 串起来(reviewer Important #7)。
|
|
6
|
+
* 下游任何 logger 调用(包括 AsyncLocalStorage 跨越的 setImmediate / await)
|
|
7
|
+
* 自动带上 reqId,无需显式传参。
|
|
8
|
+
*
|
|
9
|
+
* 不打印 body / query / headers——只 method/path/status/duration/user。
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.requestLog = requestLog;
|
|
46
|
+
const crypto = __importStar(require("crypto"));
|
|
47
|
+
const logger_1 = require("../logger");
|
|
48
|
+
// modLogger returns a lazy Proxy when called before initLogger, so
|
|
49
|
+
// module-top-level use is safe.
|
|
50
|
+
const log = (0, logger_1.modLogger)('server');
|
|
51
|
+
/**
|
|
52
|
+
* 噪声路径:不值得每次都记一条。使用 req.originalUrl 的完整路径匹配
|
|
53
|
+
* (在 path 被 Express sub-router mutate 前快照)。
|
|
54
|
+
*/
|
|
55
|
+
const SILENCED = new RegExp([
|
|
56
|
+
'^/health$',
|
|
57
|
+
'^/api/health$',
|
|
58
|
+
'^/api/auth/local-token$', // localhost 预认证,每次挂载
|
|
59
|
+
'^/api/tool/skills/check', // 前端高频轮询
|
|
60
|
+
'^/api/user-prefs/language', // 每个页面加载都拉一次
|
|
61
|
+
'^/api/claude/usage', // dashboard 轮询
|
|
62
|
+
'^/manifest\\.json$',
|
|
63
|
+
'^/favicon',
|
|
64
|
+
'^/assets/', // 前端静态资源
|
|
65
|
+
'^/plugin-sdk/',
|
|
66
|
+
'^/$', // SPA 路由回 index.html,刷新噪声大
|
|
67
|
+
].join('|'));
|
|
68
|
+
function requestLog(req, res, next) {
|
|
69
|
+
const reqId = crypto.randomUUID().slice(0, 8);
|
|
70
|
+
const start = Date.now();
|
|
71
|
+
// Snapshot originalUrl (immutable); req.path is mutated by Express sub-routers
|
|
72
|
+
// so by the time res.on('finish') fires it only holds the post-mount segment.
|
|
73
|
+
const fullPath = (req.originalUrl || req.url).split('?')[0];
|
|
74
|
+
// Reviewer I1: `requestLog` runs BEFORE `authMiddleware`, so `req.user` is
|
|
75
|
+
// always undefined at middleware entry. We pass a MUTABLE context object
|
|
76
|
+
// into ALS — `authMiddleware` (and anywhere else that identifies the user)
|
|
77
|
+
// can populate `ctx.user` later, and downstream log events see it via the
|
|
78
|
+
// same object reference. The http summary below reads user at finish time.
|
|
79
|
+
const ctx = { reqId };
|
|
80
|
+
logger_1.als.run(ctx, () => {
|
|
81
|
+
res.on('finish', () => {
|
|
82
|
+
if (SILENCED.test(fullPath))
|
|
83
|
+
return;
|
|
84
|
+
// Pull user as set by any downstream auth middleware.
|
|
85
|
+
const userAtEnd = req.user?.username;
|
|
86
|
+
if (userAtEnd && !ctx.user)
|
|
87
|
+
ctx.user = userAtEnd;
|
|
88
|
+
const ms = Date.now() - start;
|
|
89
|
+
const level = res.statusCode >= 500 ? 'error' :
|
|
90
|
+
res.statusCode >= 400 ? 'warn' :
|
|
91
|
+
'info';
|
|
92
|
+
log[level]({ method: req.method, path: fullPath, status: res.statusCode, ms, user: userAtEnd }, 'http');
|
|
93
|
+
});
|
|
94
|
+
next();
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=request-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-log.js","sourceRoot":"","sources":["../../src/middleware/request-log.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BH,gCAgCC;AA3DD,+CAAiC;AACjC,sCAA2C;AAE3C,mEAAmE;AACnE,gCAAgC;AAChC,MAAM,GAAG,GAAG,IAAA,kBAAS,EAAC,QAAQ,CAAC,CAAC;AAEhC;;;GAGG;AACH,MAAM,QAAQ,GAAG,IAAI,MAAM,CACzB;IACE,WAAW;IACX,eAAe;IACf,yBAAyB,EAAO,qBAAqB;IACrD,yBAAyB,EAAO,SAAS;IACzC,2BAA2B,EAAK,aAAa;IAC7C,oBAAoB,EAAY,eAAe;IAC/C,oBAAoB;IACpB,WAAW;IACX,WAAW,EAAqB,SAAS;IACzC,eAAe;IACf,KAAK,EAA2B,2BAA2B;CAC5D,CAAC,IAAI,CAAC,GAAG,CAAC,CACZ,CAAC;AAEF,SAAgB,UAAU,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IACxE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,+EAA+E;IAC/E,8EAA8E;IAC9E,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5D,2EAA2E;IAC3E,yEAAyE;IACzE,2EAA2E;IAC3E,0EAA0E;IAC1E,2EAA2E;IAC3E,MAAM,GAAG,GAAqC,EAAE,KAAK,EAAE,CAAC;IAExD,YAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;QAChB,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACpB,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,OAAO;YACpC,sDAAsD;YACtD,MAAM,SAAS,GAAI,GAAkD,CAAC,IAAI,EAAE,QAAQ,CAAC;YACrF,IAAI,SAAS,IAAI,CAAC,GAAG,CAAC,IAAI;gBAAE,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC;YACjD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAC9B,MAAM,KAAK,GACT,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBACjC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAE,CAAC;oBACjC,MAAM,CAAC;YACT,GAAG,CAAC,KAAK,CAAC,CACR,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EACnF,MAAM,CACP,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify-service.d.ts","sourceRoot":"","sources":["../src/notify-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"notify-service.d.ts","sourceRoot":"","sources":["../src/notify-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAKtC,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;CACzB;AAID,wBAAgB,eAAe,IAAI,YAAY,CAO9C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAI3D;AAED,cAAM,aAAc,SAAQ,YAAY;IAChC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAmC9E;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|
|
@@ -40,6 +40,8 @@ const fs = __importStar(require("fs"));
|
|
|
40
40
|
const path = __importStar(require("path"));
|
|
41
41
|
const config_1 = require("./config");
|
|
42
42
|
const events_1 = require("events");
|
|
43
|
+
const logger_1 = require("./logger");
|
|
44
|
+
const log = (0, logger_1.modLogger)('notify');
|
|
43
45
|
const NOTIFY_CONFIG_FILE = path.join(config_1.DATA_DIR, 'notify-config.json');
|
|
44
46
|
function getNotifyConfig() {
|
|
45
47
|
try {
|
|
@@ -95,7 +97,7 @@ class NotifyService extends events_1.EventEmitter {
|
|
|
95
97
|
});
|
|
96
98
|
}
|
|
97
99
|
catch (err) {
|
|
98
|
-
|
|
100
|
+
log.warn({ err }, 'webhook delivery failed');
|
|
99
101
|
}
|
|
100
102
|
}
|
|
101
103
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify-service.js","sourceRoot":"","sources":["../src/notify-service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"notify-service.js","sourceRoot":"","sources":["../src/notify-service.ts"],"names":[],"mappings":"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"}
|